fork()后杀死子进程PID是否能保证安全?

Kar*_*oll 1 c linux fork kill

考虑以下情况:

  1. 我用来fork()从我的程序创建一个子进程
  2. 父进程接收的 PID 为1234。
  3. 子进程然后调用execvp("myotherprogram", some_args);

myotherprogram预计会无限期地运行,直到收到 SIGTERM(或更高信号),但是,在某些情况下(例如丢失文件),它只会打印错误并中止。

当父进程收到事件时,它想再次杀死子进程,调用:

const int kill_result = kill(1234, SIGTERM);
Run Code Online (Sandbox Code Playgroud)

如果myotherprogram提前退出,会kill(1234, SIGTERM)是安全的,还是操作系统可以回收 PID,并且我可能会杀死一个随机进程?

Bar*_*mar 5

PID 不能被重用,直到父进程调用其中一个wait函数来获取其退出状态;在这种情况发生之前,该进程将作为“僵尸”存在。因此,您应该有一个SIGCHLD处理程序来调用waitpid()以获取退出状态。该处理程序应该禁用调用 的代码kill(),因为它不再需要,并且可能会终止另一个进程。

确保你没有忽视SIGCHLD;这可以防止僵尸并导致退出进程立即消失。

请注意,除了 root 用户之外,您只能杀死同一用户 ID 下的进程。因此,PID 被您可以杀死的进程重用的机会非常低(除非您的程序以 root 身份运行)。

  • 这就是处理程序必须禁用“kill()”代码的原因。该进程已经退出,没有什么可杀死的。 (2认同)