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