2013-01-11 3 views
0

J'essaye de réécrire le programme d'AC qui fait quelque chose comme ls | wc | wc, je l'ai déjà fait pour ls | wc, cela a fonctionné bien, mais je ne peux pas comprendre pourquoi mon le programme s'arrête sur l'enfant dans la ligne indiquée. aidez s'il vous plaît!tuyauterie deux fois en utilisant la fourchette dans C linux

int main (void) 
{ 
    pid_t pid_fils, pid_pfils; 

    int fd[2], fd2[2]; 

    if(pipe(fd)==-1 || pipe(fd2)==-1) 
    { 
     printf("pipe failed!"); 
     return 1; 
    } 

    printf("program started\n"); 
    pid_fils=fork(); 
    if(pid_fils==0) 
    { 
     pid_pfils=fork(); 
     if(pid_pfils==0) 
     { 
      //action3 
      printf("I am the grandson\n"); 
      close(fd[0]);//close read side 
      dup2(fd[1],1);//connect write with stdout 
      close(fd[1]);//close write side 
      execlp("ls","ls",(char*)0); 
      //execvp("ls",argv3); 
      return 0;/*actions grandson*/ 
     } 
     else 
     { 
      //action2 
      printf("I am the son\n"); 
      wait(); 
      printf("son, wait ok\n"); 
      >close(fd[1]); //close read side 
      >dup2(fd[0],0); //connect write with stdin 
      >close(fd[0]); //close read side 

      ///////pipe2//// 
      > close(fd2[0]); //close read side 
      >dup2(fd2[1],1); //connect write with stdout/*it stops here -can't display "ok!"*/ 
      printf("ok!\n");  
      >close(fd2[1]); //close write side 

      execlp("wc","wc",(char*)0); 
      printf("error exec returned!\n");  
      return 0; 
     } 
    } 
    else 
    { 
     ///action1 
     printf("I am the parent\n"); 
     wait(); 
     printf("parent,wait ok\n"); 
     close(fd2[1]); //close write side, 
     dup2(fd2[0],0); //connect read with stdin 
     close(fd2[0]); //close read side 
     execlp("wc","wc",(char*)0); 
     return 0;/*the parent*/ 
    } 
    return 1; 
} 
+0

Veuillez couper votre code pour inclure uniquement les pièces pertinentes. –

+3

Imprimez tout dans stderr en utilisant 'fprintf (stderr, ...'. Cela vous aidera à vous assurer que les diagnostics ne vont pas dans les tuyaux. * Et * toujours * écrire des messages d'erreur sur stderr., Par exemple, perror ("pipe failed") 'est beaucoup plus utile que' printf ("pipe failed") ' –

Répondre

3

Assurez-vous de fermer tous les descripteurs inutilisés. Dans votre cas, la solution la plus simple consiste à déplacer la création du tube (fd) dans le premier bloc if (dans le premier sous-processus). Le problème est que tant que n'importe quel processus pourrait éventuellement écrire dans le tube, le lecteur n'obtiendra pas EOF et ne se terminera donc pas.

if(pipe(fd2)==-1) 
{ 
    printf("pipe failed!"); 
    return 1; 
} 

printf("program started\n"); 
pid_fils=fork(); 
if(pid_fils==0) 
{ 
    if(pipe(fd)==-1) 
    { 
     printf("pipe failed!"); 
     return 1; 
    } 
    pid_pfils=fork(); 

Je devrais également mentionner que vous pouvez vouloir reconsidérer les appels d'attente. Vous ne savez pas exactement ce que vous voulez en faire, mais vous ne voulez pas que le processus "ls" bloque la sortie car le lecteur n'a pas encore été démarré.

1
dup2(fd2[1],1); 

Au-dessus de la ligne se ferme d'abord le fichier au descripteur 1, puis dupliquer le decriptor de FD2 [1] dans 1.

1 est stdout. Ce qui signifie que l'appel est fermé stdout.

impressions printf à stdout, ce qui signifie imprime printf à 1 qui est désormais affecté à la conduite FD2

Alors votre ok est allé dans le tuyau et non sur l'écran.

essayer

 //action2 
     printf("I am the son\n"); 
     wait(); 
     printf("son, wait ok\n"); 
     close(fd[1]); //close read side 
     dup2(fd[0],0); //connect write with stdin 
     close(fd[0]); //close read side 

     ///////pipe2//// 
     int my_terminal_out = dup(1); 
     close(fd2[0]); //close read side 
     dup2(fd2[1],1); //connect write with stdout/*it stops here -can't display "ok!"*/ 
     fprintf(my_terminal_out, "ok!\n");  
     close(fd2[1]); //close write side 

Non testé. Aussi, vous devriez tester le reste de votre code pour des erreurs similaires.

+ Ce que dit DrC.

Questions connexes