我尝试编写程序,实现下一个想法: 启动后,使用fork()和: 父进程在函数wait()上停止(等待死亡子进程); 子进程使用prctl(PR_SET_PDEATHSIG,SIGHUP)和设置信号处理程序(它有助于检测父死亡); 死后任何进程,程序再次使用fork()。
void forking_process() {
pid_t id;
printf("forking_process is called!\n");
if (id = fork()) {
parent_process_operation();
} else {
child_process_operation();
}
}
void parent_process_operation() {
int status = 0;
printf("It's parent process! Pid = %d\n", (int)getpid());
pid_t chid = wait(&status);
printf("Terminated child process with PID = %d\n", chid);
inform_about_parent_death(status);
}
void child_process_operation() {
printf("It's child process! pid = %d, ppid = %d\n",
(int)getpid(), (int)getppid());
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_handler = inform_about_parent_death;
if (sigaction(SIGHUP, &sa, NULL))
fprintf(stderr, "sigaction error\n");
prctl(PR_SET_PDEATHSIG, SIGHUP);
while(1) {
printf("."); fflush(stdout);
sleep(1);
}
}
void inform_about_parent_death(int i) {
printf("Process is dead. Restart!\n");
forking_process();
}
int main (void) {
forking_process();
return EXIT_SUCCESS;
}
如果我运行此应用程序,并在另一个终端杀死子进程 - 那么将创建子进程。 如果我一次杀死父进程, - 信号处理程序启动并调用fork()。 如果我再次杀死父进程, - 信号处理程序没有响应。 也就是说 - 第一个进程工作中的prctl(),但第二个子进程中的prctl()不起作用。 为什么会这样?我怎么能纠正它的程序?