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

问题描述 投票:0回答:1

考虑以下情况:

  1. 我使用
    fork()
    从我的程序中创建一个子进程
  2. 父进程接收 PID 作为
    1234
    .
  3. 子进程然后调用
    execve("myotherprogram");

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

当父进程收到一个事件,想要再次杀掉子进程调用:

const int kill_result = kill(1234, SIGTERM);

如果

myotherprogram
提前退出,
kill(1234, SIGTERM)
是否安全,或者操作系统是否可以回收 PID,我可能会杀死一个随机进程?

c linux fork kill
1个回答
1
投票

在父级调用

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

确保你没有忽略

SIGCHLD
;这可以防止僵尸并导致退出进程立即消失。

注意除了root用户,你只能杀掉你同一个userid下的进程。因此,您可以终止的进程重用 PID 的机会非常低(除非您的程序以 root 身份运行)。

© www.soinside.com 2019 - 2024. All rights reserved.