无法使用 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 是它的第一个子进程,所以这就是您得到的 SIGTERM
。
您的选择是:
重组您的逻辑,以便 both 子进程都由父进程创建,因此它单独,将它们的进程 ID 放入其 kids
向量中。
而不是使用 fork
使用多个执行线程和相同的进程。但是,std::vector
和任何其他 C++ 库容器都不是线程安全的。需要编写大量代码来正确地同步线程,以便事情能够正确地自行解决(更不用说 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 是它的第一个子进程,所以这就是您得到的 SIGTERM
。
您的选择是:
重组您的逻辑,以便 both 子进程都由父进程创建,因此它单独,将它们的进程 ID 放入其
kids
向量中。而不是使用
fork
使用多个执行线程和相同的进程。但是,std::vector
和任何其他 C++ 库容器都不是线程安全的。需要编写大量代码来正确地同步线程,以便事情能够正确地自行解决(更不用说SIGTERM
的模拟,关于多个执行线程,需要以某种方式发明)。
最简单的选择是第一个。