1

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

4

0 回答 0