我执行了以下代码:
#include<stdio.h>
int main()
{
printf("hello \t");
fork();
fork();
return 0;
}
输出:hello hello hello hello
这是否意味着fork()
创建子进程代码的精确副本与父进程的代码完全相同,除了执行的fork()
调用被消除了?
这让我感到困惑,因为我研究过“fork()
从代码的下一行开始执行”。所以,如果这是真的那么它应该创建3个子进程和1个父进程,并且应该只打印"hello"
一次。
请解决此问题。
我在gcc编译器上运行了这段代码。
答案 0 :(得分:4)
那是因为字符串“hello”存储在父进程的输出缓冲区中。
printf
在遇到\n
时刷新缓冲区,否则仅在缓冲区已满时打印输出字符串。
默认情况下,子进程继承父进程的缓冲区,因此如果没有刷新缓冲区,子进程的缓冲区也包含“hello”。
如果:
#include<stdio.h>
int main()
{
printf("hello \n");
fork();
fork();
return 0;
}
你只会看到一个“你好”。
答案 1 :(得分:1)
这是因为printf ...你说使用printf(“hello \ n”)以便在换行符后刷新缓冲区,或者你可以在你的代码中使用fflush(stdout)并且输出只是一个你好...