这个程序是我写的
main()
{
int pid;
pid=fork();
if(pid==0)
printf("\nI am child\n");
else
printf("\nI am parent\n");
return 0;
}
执行时的输出是
./a.out
I am parent
I am child
当我用strace程序运行时,输出是[最后一部分]
arch_prctl(ARCH_SET_FS, 0x7fd1bbf52700) = 0
mprotect(0x7fd1bbd47000, 16384, PROT_READ) = 0
mprotect(0x7fd1bbf70000, 4096, PROT_READ) = 0
munmap(0x7fd1bbf54000, 103886) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fd1bbf529d0) = 5109
I am child
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd1bbf6d000
write(1, "\n", 1
) = 1
write(1, "I am parent\n", 12I am parent
) = 12
exit_group(13) = ?
输出显示父级先运行,但 strace 输出似乎显示子级先运行,因为它先打印出来。
规则是什么?
最佳答案
没有规则。一旦进程准备好执行(即 fork
系统调用返回),它就可以根据调度配置(优先级、选择的调度程序等)运行。根据将进程添加到调度程序的方式,从 fork
返回后,可能首先调度任一进程。 (并且,正如@nos 在评论中指出的那样,这两个进程可以在多 CPU/多核系统上同时运行)。
此外,在使用 printf
时,请记住输出刷新可能会以不同的顺序发生,即使进程是按固定规则调度的。这就是 no-strace 和 strace 运行的输出不同的原因。
关于linux - 调用 fork() 时哪个进程先运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18274872/