我有一个可能包含子项的进程的PID。如何获得所有子进程的PID?我创建自己的PTY处理程序,所以当用户在这个处理程序中运行一个shell时,他可能会再运行程序(直接来自shell),每个运行程序都成为shell的子程序。所以,当我按下Ctrl + C时,我需要向最新的进程发送信号,所以需要知道最后一个的PID。
答案 0 :(得分:1)
您应该明确显示您子进程的所有pid(fork(2) ...的结果)(并在使用wait(2)等成功等待后删除pid ...)
您可以选择保留这些数据的数据结构。
任何其他方法(例如,使用proc(5) ... ps
和pstree
正在做什么。)不是非常便携且效率低下。
所以基本规则是每次调用fork
时都应该明确保留其结果(并测试3个案例:如果在子进程中为0,如果在父进程中则为> 0,< 0 on错误)并在wait
时使用它。
阅读Advanced Linux Programming;它有很多与该主题相关的页面。
您可能也会对process groups和会话感兴趣。请参阅setpgrp(2),setsid(2),daemon(3),credentials(7)等。请注意,使用负值或零pid kill(2)可以向进程组发送信号,并且您也可以使用killpg(2)来实现此目的。