gpt4 book ai didi

fork - 在 fork() 中,哪个将首先运行,父级还是子级?

转载 作者:行者123 更新时间:2023-12-04 02:33:05 25 4
gpt4 key购买 nike

当以下代码运行时,我知道在调用 fork() 后,父级和子级都会立即并行运行。

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

int main(void)
{
int pfds[2];
char buf[30];

pipe(pfds);

if (!fork()) {
printf(" CHILD: writing to the pipe\n");
write(pfds[1], "test", 5);
printf(" CHILD: exiting\n");
exit(0);
} else {
printf("PARENT: reading from pipe\n");
read(pfds[0], buf, 5);
printf("PARENT: read \"%s\"\n", buf);
wait(NULL);
}

return 0;
}

这意味着 child 将执行:
printf(" CHILD: writing to the pipe\n"); 

并且父级将执行
printf("PARENT: reading from pipe\n");

在平行下。

对于那些不熟悉 C , 在 sh :
$ sh -c 'echo CHILD & echo PARENT; wait'
PARENT
CHILD

所以我在单核 cpu 和双核上运行了这段代码,但我注意到 parent 总是先打印。由于两者是并行的,因此期望随机顺序是非常合理的。但事实并非如此。为什么会这样?

最佳答案

显然,您正在运行的任何调度程序都可以决定,并且可能会有所不同。

我可以根据经验说,如果您假设两个进程中的一个总是先运行,则会引入一些非常微妙的竞争条件。要么同步某些东西,比如管道上的特殊消息,要么不要假设任何一个先运行。

关于fork - 在 fork() 中,哪个将首先运行,父级还是子级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21586292/

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