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;
}
Veuillez couper votre code pour inclure uniquement les pièces pertinentes. –
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") ' –