我查看了手册页中的waitid,但错误部分指示:

ECHILD(对于waitid()或waitid())由id(waitid())或idtype和id(waitid())指定的进程不存在或不是调用进程的子进程.(如果SIGCHLD的操作设置为SIG_IGN,这可能会帮助您自己的子元素.另请参阅Linux Notes中有关线程的部分.)

那么,为什么在使用ptrace系统调用附加到非子进程之后,在该进程上调用waitid不会产生ECHILD错误?

其他答案指出,ptrace和waitids可以等待非子进程退出,但没有解释原因.

推荐答案

例如,在wait/waitpid年度的理由中,有The Open Group Base Specifications Issue 6 IEEE Std 1003.1, 2004 Edition个国家:

[.]WUNTRACED标志仅与作业(job)控制一起使用 支持作业(job)控制的系统.它的名字来自4.3 BSD,并引用 其中有两种类型的已停止进程 实施:processes being traced via the ptrace()次调试 设施and(未追踪)processes stopped by job control signals.[.]

遗憾的是,规范没有提供ptrace呼叫:

由于ptrace()不是这一卷IEEE标准1003.1-2001年的一部分[...]

我对此的理解是,wait/waitpid提供了这种可能的功能,其实现留给了操作系统设计人员. 例如,这个答案可能会帮助您理解Linux内核中使用的是什么"诀窍":How does ptrace work in Linux?. 因此,可以从附属进程向wait/waitpid通知状态事件,但是那些相同的进程具有保留的父子关系.

Linux ptrace手册页上写着:

PTRACE_ATTACH

附加到在PID中指定的进程,使其成为Tracee 调用进程的.Tracee收到了SIGSTOP分,但 不一定会因为完成 此调用;使用waitpid(2)等待Tracee停止. 请参阅"连接和拆卸"小节,了解 其他信息.

Linux相关问答推荐

AWK+向AWK导出值未传递

boost-iostreams 1.59 sparc-solaris 交叉编译失败

如何比较 2 个文件并将第二个文件的所有行打印到输出文件 awk

从 curl 命令输出中获取值

最小的 x86_64 Hello World ELF 二进制文件是什么?

当 skylake 有 fsgsbase 时,为什么使用 __builtin_ia32_wrfsbase64 会收到非法指令?

使用具有特定值的字段对文件进行排序

为什么 Linux (x86) 的页面大小是 4 KB,这是如何计算的?

我需要 -D_REENTRANT 和 -pthreads 吗?

如何使用不同的出口 IP 一次运行多个 Tor 进程?

判断条件是否为假

在 64 位 Linux 操作系统上编译 32 位程序导致致命错误

按主机名的 IPv6 地址

在 bash 中检测公共 IP 地址的方法

让 Tk 看起来像一个原生 Linux 应用程序

为什么 mmap() 比顺序 IO 快?

将 CMake 项目导入 Eclipse CDT

比较linux中两个未排序的列表,列出第二个文件中的唯一性

从核心转储中获取堆栈跟踪

如何等待第一个命令完成?