我尝试编写程序,实现下一个想法:启动后,使用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() 不起作用。为什么会发生?我怎样才能纠正它的程序?