linux - 调用 fork() 时哪个进程先运行

标签 linux process linux-kernel fork

这个程序是我写的

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/

相关文章:

linux - 读取进程(游戏服务器)的控制台输出,并在出现单词时进行一些操作 "join"

c - 全局描述符表的物理地址?

linux-kernel - LTTng/性能 : Difference between events used for exiting (sched_process_exit) and freeing (sched_process_free) a process

linux - 如何使用 Bash Shell 检查 Java 版本?

linux - 如何将来自 ASP.NET Core 应用程序的消息记录到 Linux 上的特定文件?

c - 如何将父进程和子进程保持在同一个核心上

c# - 如何正确地将字符串传递给ffmpeg?

java - 在 Linux Mint 中打开 Eclipse 时出错; OpenJDK 64 位服务器 VM 警告 : ignoring option MaxPermSize=512m; support was removed in 8. 0

c - 使用信号量同步进程

c - Linux 内核何时会将 SIGSEGV 的信号处理程序重置为 SIG_DFL?