【发布时间】:2019-04-05 06:20:51
【问题描述】:
我正在尝试编写代码以查看如何使用 fork 创建子进程。由于子级从父级继承文件对象和描述符,如果子级和父级都写入标准输出,如果我理解正确,输出中应该有交错。在我编写的以下代码中,我在父项和子项中声明了两个字符串,并将它们写入标准输出。我观察到的是输出中没有交错。我错过了什么吗?
代码:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
int main() {
pid_t return_value;
pid_t wait_p;
if ((return_value = fork()) != 0) {
char pa[15]= "Hi from parent\n";
char pa_2[18]= "Hello from pariii\n";
write(1, pa, 15);
write(1, pa_2, 18);
} else {
char c[17] = "Hello from child\n";
char c_2[14] = "Hi from chiii\n";
write(1, c , 17);
write(1, c_2, 14);
}
exit(0);
}
我机器上的输出(Ubutun 18.04,符合gcc):
Hi from parent
Hello from pariii
Hello from child
Hi from chiii
我看到 write 的原子性质如何导致进程不交错。但是为什么输出看起来好像父级先执行所有写入然后子级执行它的写入?另外,无论我尝试多少次,父母总是在孩子写之前写。
【问题讨论】:
-
“交错”?什么样的“交错”?
-
-
以下两个答案都是正确的。除非您的平台非常原始,否则您不太可能看到比行级交错更多的东西。更改您的输出方法以使用 putc() 之类的方法并使用 flush() 强制输出 可能 会导致您正在寻找的东西,但不能保证。
-
如果您在字符串中写入大量(兆字节,或至少数十千字节)数据(因此指定写入调用的大小),您可能(或可能不会)得到更有趣的结果将是许多千字节),并且输出将发送到管道或终端,但是使用如图所示的小字符串,您将看不到问题。
标签: c multiprocessing fork race-condition