l'écriture d'un tuyau avec un enfant et parent processus

Je suis en train de créer un enfant qui appelle de tri. Le parent qui envoie des données à l'enfant à travers un tuyau. Mon code compile et s'exécute, mais il n'y a pas de sortie. Ce que je fais mal? Suis-je de ne pas fermer les tuyaux correctement, l'écriture, les tuyaux ou d'exporter les données correctement?

[eddit], Sur mon système, j'ai besoin d'appeler /bin/sort PAS /usr/bin/tri!

#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <ctype.h>

int main(void){
int pipes[2];
pid_t pid;
FILE *stream;

if(pipe(pipes) == -1)
    printf("could not create pipe\n");

switch(fork()){
    case -1:
        fprintf(stderr, "error forking\n");
        break;
    case 0:
        dup2(pipes[0], STDIN_FILENO);

        pid = getpid();
        printf("in child, pid=%d\n");

        if(close(pipes[1]) == -1)
            fprintf(stderr,"err closing write end pid=%d\n", pid);

        execl("/usr/bin/sort", "sort",  (char*) NULL);
        break;
    default:
        stream = fdopen(pipes[1], "w");
        pid = getpid();
        printf("in parent, pid=%d\n", pid);

        if (stream == NULL)
            fprintf(stderr, "could not create file streami\n");

        if(close(pipes[0]) == -1)
            printf("err closing read end pid=%d\n");

                   fputs("bob\n",stream);
        fputs("cat\n",stream);
        fputs("ace\n",stream);
        fputs("dog\n",stream);

        if(fclose(stream) == EOF)
            fprintf(stderr, "error while closing stream\n");
        break;
    }
    return 0;
}

[edit] Voici mon code de travail. Merci à vous tous

#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(void){
int pipes[2];
pid_t pid;
FILE *stream;

int stat;
if(pipe(pipes) == -1)
    printf("could not create pipe\n");

switch(fork()){
    case -1:
        fprintf(stderr, "error forking\n");
        break;
    case 0:
        dup2(pipes[0], STDIN_FILENO);

        pid = getpid();
        printf("in child, pid=%d\n", pid);

        if(close(pipes[1]) == -1)
            fprintf(stderr,"err closing write end pid=%d\n", pid);

        if(close(pipes[0]) == -1)
            fprintf(stderr,"err closing write end pid=%d\n", pid);

        execl("/bin/sort", "sort",  (char*) NULL);
        exit(EXIT_FAILURE);
        break;
    default:
        stream = fdopen(pipes[1], "w");
        pid = getpid();
        printf("in parent, pid=%d\n", pid);

        if (stream == NULL)
            fprintf(stderr, "could not create file streami\n");

        if(close(pipes[0]) == -1)
            printf("err closing read end pid=%d\n");

        fputs("bob\n",stream);
        fputs("cat\n",stream);
        fputs("ace\n",stream);
        fputs("dog\n",stream);

        if(fclose(stream) == EOF)
            fprintf(stderr, "error while closing stream\n");
        break;
}

wait(&stat);
return 0;
}   
N'essayez pas de démarrer avec l'exécution de la "tri" dans l'enfant. Tout d'abord, assurez-vous que vous pouvez envoyer des données au travers de la conduite du parent à l'enfant, sans d'autres questions à régler. Aussi, je vous suggère d'éviter stdio initialement et il suffit d'utiliser read et write, de nouveau à mettre l'accent sur le tuyau de travail en premier.
double possible de Avoir des ennuis avec fork(), pipe(), dup2() et exec() en C - C'est la façon de le faire, et beaucoup plus complet que celui de ma réponse
FWIW (pas beaucoup) vous ne semblent avoir besoin de la <unistd.h> et <stdio.h> les en-têtes dans le code écrit. Les autres sont superflus dans ce programme.

OriginalL'auteur cmartin0 | 2012-02-13