无法使用 SIGTERM 杀死所有子进程

Can't kill all child processes using SIGTERM

本文关键字:子进程 SIGTERM      更新时间:2024-05-10

我的程序有以下父子布局:

int main() { 
std::vector<pid_t> kids;
pid_t forkid = fork();
if (forkid == 0) {
//child process
pid_t fork2 = fork() 
if (fork2 == 0) {
// child process 
}else {
//parent
kids.push_back(fork2);
}
}else {
// code here
kids.push_back(forkid);
}
// Not killing the fork2 process - only the first process(forkid) is terminated
for (pid_t k : kids) {
int status;
kill(k, SIGTERM);
waitpid(k, &status, 0);
}

}

我不能杀死子进程(fork2(-第一个进程被终止。kids矢量似乎只包含第一个进程的进程id。从不获取子进程的pid。我在这里做错了什么。任何帮助都将不胜感激。谢谢

std::vector<pid_t> kids;
pid_t forkid = fork();

fork()创建父进程的完全重复映像作为其子进程。强调:重复

这意味着,例如,子进程有自己的kids向量,与父进程的原始kids向量无关。

由于这是main中发生的第一件事,所以这实际上与您两次运行此可执行文件没有什么不同,分别作为两个不同且独立的进程,而不是fork关闭一个进程。不能指望两个进程中的一个进程中kids矢量对另一个进程的kids矢量有任何影响。

第一个子进程创建第二个子进程,并将第二个子过程的pid添加到其自己的kids向量中。但这只是第一个子进程的kids向量。

原始父进程的kids向量最终拥有的唯一进程id是第一个子进程的进程id,所以SIGTERM就是这样。

您的选择是:

  1. 重新构造逻辑,使两个子进程都由父进程创建,因此父进程单独将其进程ID放入其kids向量中。

  2. 不使用fork,而是使用多个执行线程和同一进程。但是,std::vector和任何其他C++库容器都不是线程安全的。需要编写大量的代码来正确地同步线程,以便事情能够正确地自行解决(更不用说SIGTERM相对于多个执行线程的模拟需要以某种方式发明(。

最简单的选择是第一种。