我读到,执行 fork 命令后,只有父进程才能获取子进程的进程 ID,而我们无法从子进程访问父进程的进程 ID,因此我们需要使用管道将进程 ID 从父进程传输到子进程。
我的疑问是我们不能在子进程中直接使用 getppid() 来获取父进程 id 吗?为什么它不起作用
答案1
在Linux下,您可以简单地检查内核的进程信息:
grep ^PPid: /proc/12345/status
其中 12345 是子进程的 PID。
要找到 shell 的父级,请执行以下操作
grep ^PPid: /proc/$$/status
答案2
你的前提是错误的。进程始终可以通过调用 来获取其父进程的进程 ID getppid
。getppid
是罕见的不会失败的系统调用之一。即使该进程的原始父进程已经死亡,子进程也会被 init 收养,因此getppid
将返回 1。
一个进程无法找到其子进程的 PID,或其祖父母的 PID,或其兄弟进程的 PID 等。准确地说,它可以找到,但只能通过调用ps
或某些等效方法(例如从/proc
,即任何不相关的进程都可以使用相同的方法。