我执行了以下代码:
#include<stdio.h>
int main()
{
printf("hello \t");
fork();
fork();
return 0;
}
输出:hello hello hello hello
这是否意味着fork()
为子进程创建与父进程代码完全相同的副本,但 fork()
除外执行的调用被消除了吗?
这让我很困惑,因为我在某个地方研究过“fork()
从代码的下一行开始执行”。因此,如果这是真的,那么它应该创建 3 个子进程和 1 个父进程,并且应该打印 "hello"
只有一次。
请解决这个问题。
我在 gcc 编译器上运行了这段代码。
最佳答案
这是因为字符串“hello”存储在父进程的输出缓冲区中。
printf
当遇到 \n
时刷新缓冲区,否则仅当缓冲区已满时才打印输出字符串。
默认情况下,子进程会继承父进程的缓冲区,所以如果缓冲区没有刷新,子进程的缓冲区也会包含“hello”。
如果:
#include<stdio.h>
int main()
{
printf("hello \n");
fork();
fork();
return 0;
}
您只会看到一个“你好”。
关于c - fork()的执行过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18909316/