Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 当子进程死亡时通知父进程_Unix_Process_Parent Child_Pid_Notify - Fatal编程技术网

Unix 当子进程死亡时通知父进程

Unix 当子进程死亡时通知父进程,unix,process,parent-child,pid,notify,Unix,Process,Parent Child,Pid,Notify,假设我有一个父进程,它生成的工作进程很少(子进程)。 我希望在其中一个子进程崩溃(被杀死)时得到通知 获取此通知的最佳方式是什么。 我用C或C++编程。 我使用unix。并且已经使用fork_和_exec生成了子进程。如果您只想在子进程退出(正常或异常)时收到通知,您可以将处理程序写入父进程中的信号。每当此进程生成的进程死亡时,将执行此处理程序 但是,在这个处理程序中可以执行的操作有严重的限制。如果收到其他信号,该处理器将立即中断。即使变量赋值在信号处理程序内部也不是一种安全的操作——赋值可能需

假设我有一个父进程,它生成的工作进程很少(子进程)。 我希望在其中一个子进程崩溃(被杀死)时得到通知

获取此通知的最佳方式是什么。 我用C或C++编程。
我使用unix。并且已经使用fork_和_exec生成了子进程。如果您只想在子进程退出(正常或异常)时收到通知,您可以将处理程序写入父进程中的信号。每当此进程生成的进程死亡时,将执行此处理程序

但是,在这个处理程序中可以执行的操作有严重的限制。如果收到其他信号,该处理器将立即中断。即使变量赋值在信号处理程序内部也不是一种安全的操作——赋值可能需要两条或多条机器指令,并且它可能会被一个新的信号中断,使值未定义。信号处理程序内部唯一可以安全分配的变量是sig_atomic_t类型的变量(对该类型变量的分配保证在一条指令中完成)

父进程还必须对子进程“等待”(使用等待函数),否则,子进程将在终止后变为僵尸

在我的例子中,这个解决方案已经足够了,因为我只需要减少sig_atomic_t类型的计数器变量。如果您需要在孩子死亡时进行一些“严肃”的处理,则需要其他解决方案。想法可能如下:

  • 在主进程内部,有一个专用线程,它将等待儿童死亡(这包括从主进程成功返回、被SIGTERM和SIGKILL信号杀死以及任何其他异常终止)
  • 为此,我们可以使用UNIXwaitid()方法,该方法允许我们指定正在等待的子进程、正在等待的事件类型(退出、停止或继续),并且在成功时为我们提供有关终止进程的有用信息(如子进程的PID)
  • 因此,在这个线程中,我们使用waitid()等待子线程,每次子线程死亡时,这个函数终止,为我们提供有用的信息
  • 在waitid()返回后,我们应该检查它的返回值和errno,看看是否一切正常。如果是的话,我们可以执行清理过程(我们希望在孩子死后执行的代码块),然后继续监听更多的死亡(听起来很可怕)
可以在下面找到C++示例-请注意,我并没有使用线程来等待子线程,但修改示例以使用线程应该不难

#包括
#包括
#包括
int spawn(字符*进程名称,字符**参数){
pid_t child_id=fork();
如果(子id!=0)
返回子标识;
否则{
execvp(进程名称、参数);
fprintf(stderr,“执行新进程时出错。\n”);
中止();
}
}
int main(int argc,const char*argv[]
{
字符*参数[]={
“/Path_to_Child_Exe/Child_Process”,
nullptr
};
int i=0;
而(i++<10)
生成((char*)“/Path_to_Child_Exe/Child_Process”,参数);
while(true){
siginfo\u t exit\u info;
int retVal=waitid(P_ALL,-1和exit_info,WEXITED);
如果(retVal=-1&&errno==ECHILD){
标准::cout