0

在旧的 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() 系统调用。我想在 Linux 上使用 strace 看到同样的东西(或类似的东西)。

我努力了

strace -e fork sh script.sh

strace -f sh script.sh

strace -f -e fork sh script.sh

但我看不到 fork()。Linux 和 Old SystemV 当然是不同的操作系统,可能 Unix 使用 fork() 的方式与 Linux 不同,但问题是:如何使用 strace 查看 fork() 输出?当然 script.sh 在两个系统中都包含相同的命令“ls|wc -l”,我仅将其用于测试。

4

1 回答 1

2

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

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

于 2020-05-11T01:09:07.700 回答