Question

Je suis en train de créer différents processus (3 pour être précis) et leur faire faire des choses différentes. Jusqu'ici tout va bien. Je suis en train d'attendre dans le parent jusqu'à ce que tous les enfants soient terminés. Je l'ai joué avec de nombreuses options (comme celle ci-dessous), mais soit les attentes des parents, mais je dois appuyer sur Entrée pour revenir à la coquille (ce qui signifie que certains enfants se termine après le parent?) Ou le parent ne retourne jamais à la coquille. Des idées? pointeurs vers où chercher de l'aide? Merci

 #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;

}

Était-ce utile?

La solution

jamais sortie grep et wc.

Pourquoi? Ils ne reçoivent jamais un 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 encore la fin d'écriture de pipe(fd) ouverte, donc la fin de la lecture pipe(fd) attend toujours plus de données. chose semblable va pour fd2:., même si grep sorti, wc ne se EOF sur stdin

Solution: close tous les tuyaux fds dans le processus principal avant que vous attendez

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top