gpt4 book ai didi

c - 以下程序的控制流程是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 08:22:52 25 4
gpt4 key购买 nike


我正在学习使用 fork 和 pipes。我写了下面的代码。child1 写“child 1”,child2 写“child 2”,parent 读取值。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>

int main()
{
int pfds[2];
char buf[30];
pipe(pfds);
if(fork() == 0) //child 1
{
close(pfds[0]);
write(pfds[1],"child 1",sizeof(buf));
}
else
{
if(fork() == 0) //child2
{ close(pfds[0]);
write(pfds[1],"child 2",sizeof(buf));

}
else
{
close(pfds[1]);
read(pfds[0],buf,sizeof(buf));
printf(" read: %s ",buf);
wait(NULL);

}

close(pfds[1]);
read(pfds[0],buf,sizeof(buf));
printf(" read: %s ",buf);
wait(NULL);
}


}


我的输出是: read: some_garbage_value read: child 1 read: child 2
为什么我被阅读了 3 次?我只想要它 2 次(child1 和 child2)。语句是如何执行的?
P.S:对不起,如果这是一个菜鸟问题。我刚刚开始学习 fork()、exec() 和管道。

最佳答案

忽略代码中过多的错误和遗漏检查(已在评论中指出),您要求的问题是由 fork() 将流程分成两条路径这一事实给出的在两个不同的进程上执行。这意味着在 fork() 之后,您将有两个并行执行,其中一个 fork() 返回 0,另一个返回创建进程的 pid。

因此,在第一个 fork() 之后,您将有一个进程执行 if 分支和一个进程执行 else 分支。

然后你再次 fork 一段这样完成的代码:

if (fork() == 0) {
code1;
}
else {
code2;
}

code3;

现在想象两个不同的进程,其中 fork() 返回不同的值,您将:

if (0 == 0)
code1;
else
code2;

code3;

if (123 == 0)
code1;
else
code2;

code3;

这意味着两条路径被解析为:

code1;
code3;

code2;
code3;

这解释了为什么您创建的第二个 child 尝试读取。

关于c - 以下程序的控制流程是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32636765/

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