我搜索了很多,但没有找到解决方案。所以这可能是个愚蠢的问题。
waitpid 的格式为
pid_t waitpid (pid_t pid, int *status, int options)
pid 参数准确指定要等待的进程。它的价值观分为四个阵营:
< -1
Wait for any child process whose process group ID is equal to the absolute value of this value.
-1
Wait for any child process. This is the same behavior as wait( ).
0
Wait for any child process that belongs to the same process group as the calling process.
> 0
Wait for any child process whose pid is exactly the value provided.
现在的问题是,如果父母和孩子有不同的组 id 并且孩子的组 id 是 1 怎么办。如何为这个特定的孩子使用 waitpid?因为我们不能使用 -1 它会告诉等待任何孩子。
您只能等待来自您的流程的孩子。
如果子进程更改了它的进程组 ID,则新的进程组 ID 可以用作负数,带有
waitpid()
.顺便说一句:该功能
waitpid()
自 1989 年以来已弃用。现代功能是:waitid()
它支持您喜欢的功能:如果您想等待一个进程组,请使用:
因此,如果您确实在进程组 ID 1 下有一个进程,请调用:
但是由于
init
已经使用了这个进程组 id,你需要成为init
进程才能在 pgid 1 下拥有孩子。但是,如果您使用的平台不是
waitid()
系统调用而是在过时的waitpid()
.的优点
waitid()
是:允许明确指定要等待的内容(例如 P_PID P_PGID P_ALL)
将子进程中参数的所有 32 位
exit(2)
返回给父进程。允许使用标志等待:
WNOWAIT
不会收获孩子并将其保留在进程表中以备后用。顺便说一句: siginfo_t 中的指针
waitid()
与. 的信号处理函数的第二个参数相同SIGCHLD
。遇到子进程的进程组 ID 为
1
.进程组主要用于运行前台和后台进程(管道)的 shell。通常,当一个新的进程组启动时,它会从第一个进程的进程 ID 中获取进程组 ID。你不会得到一个 PID 1 的孩子,所以你也不会得到一个 PGID 1 的孩子。
该
setpgid()
调用允许将进程从一个进程组移动到另一个进程组,但它们仍然需要成为同一(登录)会话的一部分,因此您也不能以这种方式将进程移动到 PGID 1。如果你有一个以 PID 1 运行的 shell,那么它也可以有 PGID 1。但只要 shell 更改其子代的 PGID,它们就会有不同的 PGID。