Processi figli che scrivono alternativamente

di il
5 risposte

Processi figli che scrivono alternativamente

Salve devo scrivere un programma in C che crei due processi figli,questi due processi leggono alternativamente da due file diversi 10 caratteri,una volta letti li scrivono su una pipe e il padre li leggerà. La mia domanda è come faccio a far leggere alternativamente 10 caratteri poi il padre legge poi il figlio riscrive e il padre rilegge e cosi via?

5 Risposte

  • Re: Processi figli che scrivono alternativamente

    E' un classico pattern della programmazione concorrente: produttore / consumatore.

    In questo caso hai 2 produttori, 1 consumatore ed 1 coda.

    i produttori scrivono sulla coda, il consumatore legge dalla coda

    se la coda e' piena, i produttori aspettano
    se la coda e' vuota, il consumatore aspetta

    se non hai chiaro i concetti di mutex, semaforo, accesso concorrente a risorsa, deadlock, ... potrebbe essere arduo
  • Re: Processi figli che scrivono alternativamente

    Si dovrebbe fare senza mutex l'esercizio
  • Re: Processi figli che scrivono alternativamente

    Ripropongo l'esercizio perchè avevo capito anche io male.
    Il primo figlio legge 10 caratteri il secondo ne legge altri 10 e poi il padre stampa i caratteri dei due figli alternativamente
  • Re: Processi figli che scrivono alternativamente

    Questo è il mio codice che ovviamente non funziona XD Mi stampa solo 5 caratteri anche se io gli dico di leggerne 10 e non so perchè e poi non li stampa alternativamente
    
    #include <sys/types.h>
    #include<sys/stat.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    
    int main(int argc,char **argv){
       if(argc <3){
          perror("errore nel passaggio di parametri");
          exit(1);
       }
       pid_t pid[2];
       char buffer[11],buffer2[11];
       int i,filedes[2],filedes2[2],fd,fd2,fd3,flag,status,n,m;
       if((fd=open(argv[1],O_RDONLY))<0){
          perror("errore di apetura primo file");
          exit(1);
       }
       if((fd2=open(argv[2],O_RDONLY))<0){
          perror("errore di apertura del sodecondo file");
          exit(1);
       }
       if((fd3=open(argv[3],O_WRONLY))<0){
          perror("errore di apertura del terzo file");
          exit(1);
       }
       if(pipe(filedes)<0){
          perror("errore nella prima pipe");
          exit(1);
       }
       if(pipe(filedes2)<0){
          perror("errore nella seconda pipe");
          exit(1);
       }
       for(i=0;i<2;i++){
          pid[i]=fork();
          if(pid[i]<0){
             perror("errore di fork");
             exit(1);
          }
          if(pid[i]==0){
             printf("INIZIO PROCESSO FIGLIO %d \n",i);
             if(i==0){
                close(filedes[0]);
                if((read(fd,buffer,10))<0){
                   perror("non riesco a leggere il primo file");
                   exit(1);
                }
                if((write(filedes[1],buffer,10))<0){
                   perror("errore di scrittura sulla pipe");
                   exit(1);
                }
             }   
             else{
                close(filedes2[0]);
                if((read(fd2,buffer2,10))<0){
                   perror("errore di lettura nel secondo file");
                   exit(1);
                }
                if((write(filedes2[1],buffer2,10))<0){
                   perror("errore di scrittura sul secondo file");
                   exit(1);
                }
             }
             printf("FINE PROCESSO FIGLIO %d\n",i);
             exit(0);
          }
          else{
             wait(&status);
             printf("INIZIO PROCESSO PADRE %d \n",i);
             if(i==1){
                close(filedes[1]);
                close(filedes2[1]);
                while((n=read(filedes[0],buffer,1))>0 || (m=read(filedes2[0],buffer2,1))>0){
                   if(write(STDOUT_FILENO,buffer,n)<0){
                      perror("errore di lettura dalla prima pipe");
                      exit(1);
                   }
                   if(write(STDOUT_FILENO,buffer2,m)<0){
                      perror("errore di lettura dalla seconda pipe");
                      exit(1);
                   }
                }
             }   
             printf("FINE PROCESSO PADRE %d \n",i);
          }
       }
       exit(0);
    }
    
  • Re: Processi figli che scrivono alternativamente

    RISOLTO!!! però mi stampa solo e sempre 5 caratteri ma non capisco il perchè qualcuno può aiutarmi vi prego
    p.s ho visto un altro errore se vado a stampare su un file mi scrive simboli strani perchè?
    
    #include <sys/types.h>
    #include<sys/stat.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    
    int main(int argc,char **argv){
       if(argc <3){
          perror("errore nel passaggio di parametri");
          exit(1);
       }
       pid_t pid[2];
       char buffer[11],buffer2[11];
       int i,filedes[2],filedes2[2],fd,fd2,fd3,flag,status,n,m;
       if((fd=open(argv[1],O_RDONLY))<0){
          perror("errore di apetura primo file");
          exit(1);
       }
       if((fd2=open(argv[2],O_RDONLY))<0){
          perror("errore di apertura del sodecondo file");
          exit(1);
       }
       if((fd3=open(argv[3],O_WRONLY))<0){
          perror("errore di apertura del terzo file");
          exit(1);
       }
       if(pipe(filedes)<0){
          perror("errore nella prima pipe");
          exit(1);
       }
       if(pipe(filedes2)<0){
          perror("errore nella seconda pipe");
          exit(1);
       }
       for(i=0;i<2;i++){
          pid[i]=fork();
          if(pid[i]<0){
             perror("errore di fork");
             exit(1);
          }
          if(pid[i]==0){
             printf("INIZIO PROCESSO FIGLIO %d \n",i);
             if(i==0){
                close(filedes[0]);
                if((read(fd,buffer,10))<0){
                   perror("non riesco a leggere il primo file");
                   exit(1);
                }
                if((write(filedes[1],buffer,10))<0){
                   perror("errore di scrittura sulla pipe");
                   exit(1);
                }
             }   
             else{
                close(filedes2[0]);
                if((read(fd2,buffer2,10))<0){
                   perror("errore di lettura nel secondo file");
                   exit(1);
                }
                if((write(filedes2[1],buffer2,10))<0){
                   perror("errore di scrittura sulla seconda pipe");
                   exit(1);
                }
             }
             printf("FINE PROCESSO FIGLIO %d\n",i);
             exit(0);
          }
          else{
             wait(&status);
             printf("INIZIO PROCESSO PADRE %d \n",i);
             if(i==1){
                close(filedes[1]);
                close(filedes2[1]);
                for(i=0;i<10;i++){
                   read(filedes[0],buffer,1);
                   read(filedes2[0],buffer2,1);
                   printf("%c",buffer[0]);
                   printf("%c",buffer2[0]);
                }
             }   
             printf("FINE PROCESSO PADRE %d \n",i);
          }
       }
       exit(0);
    }
    
Devi accedere o registrarti per scrivere nel forum
5 risposte