第二次调用prctl()不工作

时间:2012-11-05 17:32:54

标签: linux process fork

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

0 个答案:

没有答案