考虑以下情况:
fork()
从我的程序中创建一个子进程1234
.execve("myotherprogram");
myotherprogram
预计将无限期运行,直到它收到 SIGTERM(或更高),但是,在某些情况下(例如丢失文件)它只会打印错误并中止。
当父进程收到一个事件,想要再次杀掉子进程调用:
const int kill_result = kill(1234, SIGTERM);
如果
myotherprogram
提前退出,kill(1234, SIGTERM)
是否安全,或者操作系统是否可以回收 PID,我可能会杀死一个随机进程?
在父级调用
wait
函数之一以获取其退出状态之前,PID不能被重用;在这种情况发生之前,该过程一直作为“僵尸”存在。所以你应该有一个 SIGCHLD
处理程序调用 waitpid()
来获取退出状态。这个处理程序应该禁用调用kill()
的代码,因为它不再需要并且可以杀死不同的进程。
确保你没有忽略
SIGCHLD
;这可以防止僵尸并导致退出进程立即消失。
注意除了root用户,你只能杀掉你同一个userid下的进程。因此,您可以终止的进程重用 PID 的机会非常低(除非您的程序以 root 身份运行)。