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
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
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
Vous devez vous connecter pour publier un commentaire.
Vous certainement n'avez pas assez de
close()
appels dans le code qui permet de verrouiller le processus jusqu'.Pseudo-code:
Noter que le code de pseudo finit par fermer toutes les quatre extrémités de la conduite - les en deux dans le père et les deux chez l'enfant. Si vous ne le faites pas, vous allez courir dans une impasse.
Il manque des arguments à deux
printf()
états, qui provoque un comportement indéfini...Vous ne fermez paspipe[0]
chez l'enfant, mais je pense que c'est en fait inoffensives. Oui, je n'avais pas remarqué que vous avez fermé l'écriture de flux de mon mauvais. Quand j'ai pris ton code et fixe leprintf()
déclarations et il a couru sur mac os X 10.7.2, j'ai eu l'attendait 'as', 'bob', 'chat', 'chien' de sortie, mais un peu entrelacés avec shell invites. Il est toujours intéressant d'impression, un message d'erreur après unexec()
; si leexec()
retourne, il a échoué.Je vous remercie. fonctionne maintenant
OriginalL'auteur Jonathan Leffler
La seule chose que vous êtes vraiment en manque, c'est l'appel de
wait()
ouwaitpid()
à la fin du parent du code, de manière à ne pas quitter jusqu'à ce que l'enfant a fini.OriginalL'auteur caf
Pas d'arguments à la commande de tri. Tout simplement l'exécution d'une execl ne fonctionnera pas.
Un programme simple pour tester serait:
Je vais essayer de créer un programme simple pour vous d'analyser la situation.
Ici, vous allez, essayez ce code:
Ici "fichier" est un fichier qui doivent être triés.
Espère que vous pouvez le personnaliser selon votre besoin.
Profiter..!!!
Le code après execl() est appelée que si excel() a échoué, donc vous ne devriez pas mettre des choses de leur
OriginalL'auteur Genelia D'souza