无法使用 SIGTERM 杀死所有子进程
Can't kill all child processes using SIGTERM
我的程序有以下父子布局:
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
就是这样。
您的选择是:
重新构造逻辑,使两个子进程都由父进程创建,因此父进程单独将其进程ID放入其
kids
向量中。不使用
fork
,而是使用多个执行线程和同一进程。但是,std::vector
和任何其他C++库容器都不是线程安全的。需要编写大量的代码来正确地同步线程,以便事情能够正确地自行解决(更不用说SIGTERM
相对于多个执行线程的模拟需要以某种方式发明(。
最简单的选择是第一种。
相关文章:
- 终止 QProcess 不会终止子进程
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 子进程更新共享 mmap 内存,但父进程没有更改
- 使用 waitpid 时等待子进程终止
- 使用重定向标准处理子进程中的 kbhit
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- kill() 总是返回 0(成功),即使在子进程已经结束之后?
- 父进程和子进程之间的 POSIX 信号量
- 检测到由于操作系统内存不足而导致子进程终止
- 使用system()创建独立的子进程
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 在 Bash 脚本中处理来自子进程的信号
- Qt C++ - 如何成功将数据传递给子进程?
- C++ 窗口本地系统模拟在子进程中失败
- 将类型化数组写入子进程 stdin 无法正常工作
- 将 nodejs 脚本作为子进程执行(而不是从其他脚本执行)
- 使用信号检测子进程何时终止的最佳方法是什么?
- 等待等待失效的子进程
- 让 Gnu 屏幕将 SIGTERM 信号传递给子进程,允许它们干净地关闭