带-D和不带-D的strace中跟踪器、被跟踪者和调用进程之间有什么关系?

带-D和不带-D的strace中跟踪器、被跟踪者和调用进程之间有什么关系?

我很难理解 strace 的 -D 选项。 strace 手册页说

-D 作为独立孙子运行跟踪器进程,而不是作为被跟踪者的父进程。通过将被跟踪者保持为调用进程的直接子进程,这可以减少 strace 的可见影响。

“跟踪器进程”是运行 strace 的进程吗?

“调用进程”是“跟踪进程”的父进程吗?

不带 -D 和带 -D 时,跟踪器、被跟踪者和调用进程之间的父子关系是什么?

谢谢!

答案1

跟踪进程是运行的进程strace,是的。调用进程是启动的进程strace,通常是您的 shell。

如果没有-D,被跟踪进程的父进程最终会是strace

strace sleep 120

显示pstree

-───zsh───strace───sleep

随着-Dstrace它自我分离,并最终在我的系统上重新成为我的用户systemd进程的父进程:

    |-systemd-+-(sd-pam)
   ...
    |         |-gnome-terminal--+-3*[zsh]
    |         |                 |-zsh---sleep
   ...
    |         |-strace

该选项的影响-D简要描述于手册strace:

请注意,除非使用getppid(),否则不会保留跟踪进程与其父进程之间的父子关系(信号停止通知、值等)。-D

运行 with-D意味着子进程在调用 时会找到其期望的父进程getppid(),并且还可以使SIGCHLD子进程停止和继续时行为正确。当您strace在进程及其子进程之间插入时,当其子进程需要找到其父进程时,这可能很重要。

相关内容