gpt4 book ai didi

c - 管道没有得到 EOF

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

我正在尝试编写一个使用管道在 3 个 Linux 命令之间传递信息的测试程序。 bash 相当于“ls | wc | wc”。下面是我的代码我得到的唯一输出是。程序卡在那里没有退出。

./a.out
开始主要
首先创建管道

bash 中的预期输出类似于

ls |厕所 |厕所
1 3 24
编辑:在运行 strace 时,我可以看到主进程在 wait4 上,两个 wc 进程卡在 read(0) 上。正如我所猜测的,这是因为 wc 没有得到 EOF。为什么会这样?有人可以帮我找出问题所在吗?

#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>

int p[2];
int p1[2];
int r=0;


int fork1(void)
{
int pid;
pid = fork();
if(pid == -1) {
perror("fork");
exit(1);
}
return pid;
}
int main (int argc, char const* argv[])
{
printf("starting main\n");
printf("creating pipe first\n");
if(pipe(p)<0) {
perror("pipe");
exit(1);
}
if(pipe(p1)<0) {
perror("pipe");
exit(1);
}
if(fork1()==0) {
//send output to p
close(1);
dup(p[1]);
close(p[0]); close(p[1]);

execlp("ls","ls",NULL);
exit(0);

}
if(fork1() == 0) {
close(1);//write to p1
dup(p1[1]);
close(p1[1]); close(p1[0]);

close(0);//read from p
dup(p[0]);
close(p[0]); close(p[1]);
execlp("wc","wc",NULL);
exit(0);
}
if(fork1() == 0)
{

close(0);//read from p1
dup(p1[0]);
close(p1[0]); close(p1[1]);
execlp("wc","wc",NULL);
exit(0);
}
close(p[0]); close(p[1]); close(p1[0]); close(p1[1]);
wait(&r);wait(&r);wait(&r);
printf("parent done\n");

return 0;
}

最佳答案

问题是我没有关闭每个分支中的所有管道。我不得不关闭所有三个 fork 和父级中的 p,p1。一旦我添加了这些,它就开始工作了

关于c - 管道没有得到 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26273251/

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