【发布时间】:2017-09-02 19:29:10
【问题描述】:
当我用 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 installes probes on _do_fork 而不是克隆,但这不应该改变任何东西。)
这让我很困惑。几个相关的问题:
- 为什么系统调用只返回一次?
- 如果我对
_do_forkcode 的理解正确,则该进程被克隆在函数的中间。 (copy_process和wake_up_new_task)。后面的代码不应该在两个进程中运行吗? - 系统调用后的内核代码是否与系统调用前的用户代码在同一线程/进程中运行?
【问题讨论】:
标签: c linux kernel systemtap kprobe