假设我有一个只产生一个子进程的进程.现在,当父进程因任何原因(正常或异常,通过kill,^ C,断言失败或其他任何原因)退出时,我希望子进程死掉.如何正确地做到这一点?
stackoverflow上的一些类似问题:
关于Windows的 stackoverflow的一些类似问题:
我正在使用ProcessBuilder启动子进程,并且如果父进程执行,则需要子进程退出.在正常情况下,我的代码正在正确地阻止孩子.但是,如果我导致操作系统杀死父级,则子级将继续运行.
有没有办法将子进程"绑定"到父进程,这样当父进程被杀时它会退出?
类似的问题:
在使用pthreads的C++中,如果你的一个线程调用fork,你的其他线程会发生什么?
似乎线程不遵循.在我的情况下,我正在尝试创建一个守护进程,我使用fork()与父进程deamonize它.但是,在通过代码的新路径中,我在fork之前创建了一些线程,之后又创建了一些线程.是否有一种简单的方法可以将线程的所有权更改为新的分叉进程,而不是在fork之后移动我的所有线程创建?
这些问题的过去答案都集中在分叉上:
对于这个问题,我只是询问对'系统'功能的调用.
假设我有一个名为sleep.pl的脚本:
use strict;
use warnings;
sleep(300);
Run Code Online (Sandbox Code Playgroud)
然后我有一个名为kill.pl的脚本
use strict;
use warnings;
system("sleep.pl");
Run Code Online (Sandbox Code Playgroud)
我运行kill.pl并使用ps我找到kill.pl的进程ID并杀死它(不使用kill -9,只是普通的kill)
sleep.pl还在睡觉.
我想我的问题的解决方案涉及一个SIG处理程序,但是我需要将什么内容放入处理程序来杀死子进程?
通常,如果我通过以下方式创建进程:
Process proc = new ProcessBuilder("some_long_running_script.py").start();
Run Code Online (Sandbox Code Playgroud)
然后我的java程序完成,我可以看到脚本进程继续运行(如预期的那样)
但是,如果我然后添加代码:
proc.waitFor();
Run Code Online (Sandbox Code Playgroud)
然后在脚本完成之前杀死我的java程序,我可以看到脚本也死了(不像预期的那样).
这似乎是说"waitFor()"以某种方式将脚本进程与我的java进程合并,这是设计的吗?我似乎无法在文档中的任何地方看到它.
这可能是特定于操作系统吗 我在Mac Yosemite上运行
我正在练习使用并行编程fork().我希望每个进程的父ID都是前进程的id,但在我的输出中显示相同的id.为什么?第二个问题是关于终止.有时输出显示所有进程,有时只有两个或三个,有时只有一个.为什么?我知道父母的过程应该等待它的孩子,但如果不是在我的问题中.我的困惑是,在fork()调用时,两个进程都是在不知道命令的情况下执行的,不是吗?也许父进程终止自己的执行.但它的孩子可以继续跑步到其余的节目或终止或其他什么?(因为它可以在输出上看到并不总是终止,也不总是完全正确)我不理解输出只显示一个但有时两个或三个或不是全部.我希望我能解释一下我的问题.看来,我做不到.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main (int argc, char *argv[]) {
pid_t childpid = 0;
int i;
for (i = 0; i < 3; i++)
if (childpid = fork())
break;
fprintf(stderr, "i:%d process ID:%ld parent ID:%ld child ID:%ld\n",
i, (long)getpid(), (long)getppid(), (long)childpid);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出(S):
i:0 process ID:2783 parent ID:1954 child ID:2784
i:1 process ID:2784 parent ID:1 child ID:2785
i:2 process ID:2785 parent ID:1 child ID:2786 …Run Code Online (Sandbox Code Playgroud)