C generare 2 figli e comunicazione tramite pipe

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
antonx
Prode Principiante
Messaggi: 142
Iscrizione: sabato 14 giugno 2014, 15:11

C generare 2 figli e comunicazione tramite pipe

Messaggio da antonx »

Ragazzi sto impazzendo non trovo l'errore in questo codice potete aiutarmi?
in pratica apro un file e dopo aver creato due processi,faccio leggere sul file e solo dopo aver trovato un carattere salvato nella variabile argv[3] inizio a scrivere nella pipe. il processo padre dovrà leggere tutti i caratteri e quanti caratteri sono stati letti.

Codice: Seleziona tutto

#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){
   char a[1];
   pid_t pid[2];
   if (argc < 3){
      perror("errore nel passaggio di parametri");
      exit(1);
   }
   int filedes[2],fd,fd2,n,flag=1,i=0,letti=0,status;
   if((fd=open(argv[1],O_RDONLY))<0){
      perror("errore nell'apertura del file");
      exit(1);
   }
   if((fd2=open(argv[2],O_WRONLY))<0){
      perror("errore");
      exit(1);
   }
   if(pipe(filedes)<0){
      perror("errore di pipe");
      exit(1);
   }
   for(i=0;i<2;i++){
      pid[i]=fork();
      if(pid[i]<0){
         perror("errore di fork");
         exit(1);
      }
      else if(pid[i]==0){
         close(filedes[0]);
          while((n=read(fd,a,1))>0){
             if(write(STDOUT_FILENO,a,n)<0){
                perror("errore in lettura");
                close(fd);
                exit(1);
             }
             if(a==argv[3])
                flag=1;
             if(flag==1){
                if(write(filedes[1],a,1)<0){
                   perror("errore in scrittura");
                   close (fd);
                }
                letti++;
            }
         }
         if(write(filedes[1],"letti",5)<0){
                   perror("errore in scrittura");
                   close(fd);
         }
         printf("questo è il flag %d\n",flag);
         exit(0);
      }
      else if (pid[i]>0){
        if(wait(&status)==-1){
           perror("errore per il processo figlio");
           close(fd);
           exit(1);
        }
         while((n=read(filedes[0],a,1))>0){
            if(write(fd2,a,1)<0){
               perror("errore in lettura");
               exit(1);
            }
         }
      }
  }
  close (fd2);
  printf("FINE");
  exit(0);
  }
è come se funzionasse un solo figlio e poi mi fa inserire sempre una scritta
antonx
Prode Principiante
Messaggi: 142
Iscrizione: sabato 14 giugno 2014, 15:11

Re: C generare 2 figli e comunicazione tramite pipe

Messaggio da antonx »

sapete cosa non va ? :muro: :cry:
antonx
Prode Principiante
Messaggi: 142
Iscrizione: sabato 14 giugno 2014, 15:11

Re: C generare 2 figli e comunicazione tramite pipe

Messaggio da antonx »

ho modificato il codice

Codice: Seleziona tutto

#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){
   char a[1],b[1];
   pid_t pid[2];
   if (argc < 3){
      perror("errore nel passaggio di parametri");
      exit(1);
   }
   int filedes[2],filedes2[2],fd,fd2,n,flag=0,i=0,j=0,letti=0,status;
 /*
   if((fd=open(argv[1],O_RDONLY))<0){
      perror("errore nell'apertura del file");
      exit(1);
   }
   if((fd2=open(argv[2],O_WRONLY))<0){
      perror("errore");
      exit(1);
   }
*/
   if(pipe(filedes)<0){
      perror("errore della seconda pipe");
      exit(1);
   }
   if(pipe(filedes2)<0){
      perror("errore della seconda pipe");
      exit(1);
   }
   for(i=0;i<2;i++){
      pid[i]=fork();
      if(pid[i]<0){
         perror("errore di fork");
         exit(1);
      }
      else if(pid[i]==0){
         close(filedes[0]); 
         close(filedes2[0]);
         printf("PROCESSO FIGLIO PARTITO\n");
/*       
         close(filedes[0]);
          while((n=read(fd,a,1))>0){
             if(write(STDOUT_FILENO,a,n)<0){
                perror("errore in lettura");
                close(fd);
                exit(1);
             }

             if(a==argv[3])
                flag=1;
             if(flag==1){
                if(write(filedes[1],a,1)<0){
                   perror("errore in scrittura");
                   close (fd);
                }
                letti++;
            }
         }
         */
         if(i==0){
            if(write(filedes[1],"letti",5)<0){
               perror("errore in scrittura");
               exit(1);
            }
        }
         else{
            if(write(filedes2[1],"letti",5)<0){
               perror("errore in scrittura");
               exit(1);
            }
         }
         flag=0;
         printf("processo figlio finito\n");
         exit(0);
      }
      else if (pid[i]>0){
        close(filedes[1]);
        close(filedes2[1]);
        printf("processo padre partito\n");
        wait (&status);
      /*
        if(waitpid(pid[i],&status)<0){
        perror("errore di wait");
        exit(1);
      }
     */ 
      if(i==0){
         while((n=read(filedes[0],a,1))>0){
            if(write(STDIN_FILENO,a,n)<0){
               perror("errore in lettura");
               exit(1);
            }
         }
      }
      else{   
         while((n=read(filedes2[0],b,1))>0){
            if(write(STDIN_FILENO,b,n)<0){
               perror("errore in lettura");
               exit(1);
            }
         }
      }

      printf("processo padre finito\n");
      }
  }
/*
  for(j=0;j<2;j++){
      wait(&status);
 */
  printf("FINE");
  exit(0);
  }
           
quello che non va è il secondo pipe mi dice bad file descriptor e quindi non riesce a scriverci
antex
Prode Principiante
Messaggi: 85
Iscrizione: mercoledì 14 marzo 2012, 20:59

Re: C generare 2 figli e comunicazione tramite pipe

Messaggio da antex »

Un po' come nell'altra discussione, devi stare attento al codice del padre.

Tolta un po' di roba e aggiunta qualche printf per evidenziare il problema:
[code2=cpp]#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>
#include <sys/wait.h>

int main() {
char a[1], b[1];
pid_t pid[2];
int filedes[2], filedes2[2], n, i = 0, status;
if (pipe(filedes) < 0) {
perror("errore della seconda pipe");
exit(1);
}
if (pipe(filedes2) < 0) {
perror("errore della seconda pipe");
exit(1);
}
for (i = 0; i < 2; i++) {
printf("Creo il figlio n. %d\n", i + 1);
pid = fork();
if (pid < 0) {
perror("errore di fork");
exit(1);
}
else if (pid == 0) {
close(filedes[0]);
close(filedes2[0]);
if (i == 0) {
if (write(filedes[1], "letti", 5) < 0) {
perror("errore in scrittura (figlio n. 1)");
exit(1);
}
}
else {
printf("Sto per usare filedes2[1]\n");
if (write(filedes2[1], "letti", 5) < 0) {
perror("errore in scrittura (figlio n. 2)");
exit(1);
}
}
exit(0);
}
else if (pid > 0) {
printf("Sto chiudendo filedes[1] e filedes2[1]\n");
close(filedes[1]);
close(filedes2[1]);
wait(&status);
if (i == 0) {
while ((n = read(filedes[0], a, 1)) > 0) {
if (write(STDIN_FILENO, a, n) < 0) {
perror("errore in lettura");
exit(1);
}
}
}
else {
while ((n = read(filedes2[0], b, 1)) > 0) {
if (write(STDIN_FILENO, b, n) < 0) {
perror("errore in lettura");
exit(1);
}
}
}
}
}
exit(0);
}[/code2]

Output:

Codice: Seleziona tutto

Creo il figlio n. 1
Sto chiudendo filedes[1] e filedes2[1]
lettiCreo il figlio n. 2
Sto chiudendo filedes[1] e filedes2[1]
Sto per usare filedes2[1]
errore in scrittura (figlio n. 2): Bad file descriptor
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 16 ospiti