gpt4 book ai didi

c - 在 C linux 中使用 fork 管道两次

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:18 25 4
gpt4 key购买 nike

我正在尝试重写一个执行类似 ls|wc|wc 的 c 程序,我已经为 ls|wc 做了它,它工作正常,但我无法弄清楚为什么我的程序在指定的子节点处停止线。请帮忙!

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

最佳答案

确保关闭所有未使用的描述符。在您的情况下,最简单的解决方案是将 pipe(fd) 的创建移动到第一个 if block (在第一个子进程中)。问题是只要任何进程都可能写入管道,读取器就不会收到 EOF,因此不会终止。

if(pipe(fd2)==-1)
{
printf("pipe failed!");
return 1;
}

printf("program started\n");
pid_fils=fork();
if(pid_fils==0)
{
if(pipe(fd)==-1)
{
printf("pipe failed!");
return 1;
}
pid_pfils=fork();

我还应该提一下,您可能需要重新考虑等待电话。不确定您打算用它们做什么,但您不希望“ls”进程阻塞输出,因为阅读器尚未启动。

关于c - 在 C linux 中使用 fork 管道两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14288559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com