当我用 fork 编写一个小脚本时,系统调用返回两个进程(每个进程一次):
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int pid = fork();
if (pid == 0) {
// child
} else if (pid > 0) {
// parent
}
}
如果我使用 systemtap 进行检测,我只会找到一个返回值:
// fork() in libc calls clone on Linux
probe syscall.clone.return {
printf("Return from clone\n")
}
(SystemTap 安装探针_do_fork
而不是克隆,但这不应该改变任何东西。)
这让我很困惑。几个相关的问题:
- 为什么系统调用只返回一次?
- 如果我正确理解了
_do_fork
代码,该过程将被克隆到函数的中间。(copy_process
和wake_up_new_task
)。后续代码不应该在两个进程中运行吗? - 系统调用之后的内核代码是否与系统调用之前的用户代码在同一线程/进程中运行?