strace,如何查看fork系统调用?

Strace, how to see the fork syscall?

在旧的 SystemV Unix 上使用 "truss" 程序(类似于 strace)

truss script.sh
.....

fork()                                          = 382
      6 
    Received signal #18, SIGCLD, in waitsys() [default]
      siginfo: SIGCLD CLD_EXITED pid=382 uid=0 status=0x0000

.....

在长输出中我可以看到 fork() 系统调用。 我想使用 strace 在 Linux 上看到相同的东西(或类似的东西)。

我试过了

strace -e fork sh script.sh

strace -f sh script.sh

strace -f -e fork sh script.sh

但是我看不到 fork()。 Linux 和 Old SystemV 当然是不同的 OS,并且可能 Unix 使用 fork() 的方式与 Linux 不同,但问题是:如何使用 fork() 查看 fork() 输出跟踪? 当然script.sh在两个系统中包含相同的命令"ls|wc -l",我只用它来测试。

当前版本的Linux提供了一个名为clone(2)的系统调用(参见https://linux.die.net/man/2/clone并向下滚动到sys_clone的描述),这是一个通用的系统调用用于创建新任务。有一些选项可以准确地确定新任务应该与其父任务共享哪些资源(内存、文件描述符等),以便系统调用可用于创建新进程或新线程或介于两者之间的任何东西。尽管内核仍然提供 fork 系统调用以实现向后兼容性,但当前版本的 glibc 会根据 clone(2) 实现 fork()

因此,即使您可能在 sh 的源代码中看到对 fork() 的调用,strace 的输出也会显示 clone 系统调用。所以你应该寻找那个而不是 fork.