gpt4 book ai didi

c - 程序的行为根据调用 fork 的位置而变化

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

我正在开发一个小程序以熟悉管道和文件描述符,并花了很多时间调试一个没有意义的问题。

我花了很多时间思考我误解了文件描述符,因为它只是程序根据我使用 fork 的位置而表现不同。

int main(void)
{
int fid;
int p[2];
pipe(p);
char buf[20];

fid = fork();
if (fid==0){
close(p[1]);
dup2(p[0],0);
close(p[0]);
execlp("cat","cat",(char *)NULL);

}
else{
close(p[0]);
dup2(p[1],1);
close(p[1]);
execlp("ls","ls",(char *)NULL);
}

return 0;
}

给我该目录中的预期输出。 ls out put 通过管道传输到 cat。

如果我将 fork 线移到管道 (p) 上方;我不会得到任何输出。我不明白为什么会这样?

最佳答案

所以您想知道为什么会这样:

pipe(p);
fid = fork();

这不是:

fid = fork();
pipe(p);

原因很简单:在第一种情况下,进程创建一个管道,然后分成两个(两个进程都可以访问管道)。

在第二种情况下,进程一分为二,然后这两个进程中的每一个都创建自己的管道,与另一个进程无关。

所以在第一种情况下,一个进程写入管道,另一个进程从中读取。在第二种情况下,一个进程写入管道,另一个进程从不同的管道读取数据,这显然没有收到数据,因为它是不同的管道。

关于c - 程序的行为根据调用 fork 的位置而变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35691829/

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