2009-12-14 7 views
2

Je crée différents processus (3 pour être précis) et les fait faire des choses différentes. Jusqu'ici tout va bien. J'essaye d'attendre dans le parent jusqu'à ce que tous les enfants soient terminés. J'ai joué avec de nombreuses options (comme celle listée ci-dessous) mais le parent attend mais je dois appuyer sur Entrée pour retourner au shell (ce qui veut dire que certains enfants terminent après le parent?) Ou le parent ne retourne jamais au coquille. Des idées? des pointeurs vers où chercher plus d'aide? Merciforcer plusieurs processus et faire en sorte que le parent les attende tous (en C)

#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <string.h> 
#include <errno.h> 

#define READ_END 0 
#define WRITE_END 1 


int main (int argc, char **argv) 
{ 
pid_t pid; 
int fd[2]; 
int fd2[2]; 

pipe(fd); 
pipe(fd2); 

for (int i=0; i<3; i++) { 
    pid=fork(); 

    if (pid==0 && i==0) { 

     //never uses fd2, so close both descriptors 
     close(fd2[READ_END]); 
     close(fd2[WRITE_END]); 

     printf("i'm the child used for ls \n"); 
     close(fd[READ_END]); /*close read end since I don't need it */ 
     dup2(fd[WRITE_END], STDOUT_FILENO); 
     close(fd[WRITE_END]); 
     execlp("ls", "ls", "-hal", NULL); 


     break; /*exit for loop to end child's code */ 
    } 

    else if (pid==0 && i==1) { 
     printf("i'm in the second child, which will be used to run grep\n"); 
     close(fd[WRITE_END]); 
     dup2(fd[READ_END], STDIN_FILENO); 
     close(fd[READ_END]); 

     close(fd2[READ_END]); 
     dup2(fd2[WRITE_END], STDOUT_FILENO); 
     close(fd2[WRITE_END]); 
     execlp("grep", "grep","p",NULL); 
     break; 
    } 
    else if (pid==0 && i==2) { 

     //never uses fd so close both descriptors 
     close(fd[READ_END]); 
     close(fd[WRITE_END]); 

     printf("i'm in the original process which will be replaced with wc\n"); 

     close(fd2[WRITE_END]); 
     dup2(fd2[READ_END], STDIN_FILENO); 
     close(fd2[READ_END]); 
     printf("going to exec wc\n"); 
     execlp("wc","wc","-w",NULL); 
     break; 
     } 
     else { 
     //do parenty things 
     } 
     } 

     wait(NULL); 
     while (1){ 
       wait(NULL); 
       if(errno== ECHILD) { 
        printf("all children ended\n"); 
        break; 
       } 
       } 




     close(fd[READ_END]); 
     close(fd[WRITE_END]); 
     close(fd2[READ_END]); 
     close(fd2[WRITE_END]); 






return 0; 

}

+1

Pouvez-vous s'il vous plaît corriger le code que le formatage est vissé? – t0mm13b

+0

tous fixés :) thx – theprole

Répondre

7

grep et wc jamais sortie.

Pourquoi? Ils ne reçoivent jamais d'EOF sur stdin.

Pourquoi? Parce que, même si ls a quitté et fermé la fin d'écriture de pipe(fd), le processus principal a toujours la fin d'écriture de pipe(fd) ouvert, ainsi la fin de lecture de pipe(fd) attend toujours plus de données. La même chose vaut pour fd2: même si grep est sorti, wc n'obtiendrait pas un EOF sur stdin.

Solution: close tous les tuyaux fds dans le processus principal avant d'attendre.

+0

vous avez raison! fonctionne flawlesly maintenant! Merci de votre aide! – theprole

+0

vous devez cliquer sur la coche à côté de cette réponse s'il a répondu à votre question – bdonlan

Questions connexes