wait()是否会干扰主流程?

时间:2018-09-04 06:59:44

标签: c fork child-process

以下是我的代码的主要部分(摘自清单3.7的“高级linux编程”):

void clean_up_child_process ( int signal_number ) {
  /* Clean up the child process. */
  int status ;
  wait ( &status ) ;

  printf ( " wait finished \n" ) ;

  /* Store its exit status in a global variable. */
  child_exit_status = status ;
}

int main() {
  /* Handle SIGCHLD by calling clean_up_child_process. */
  pid_t child_pid ;
  struct sigaction sigchld_action ;
  memset ( &sigchld_action, 0, sizeof(sigchld_action) ) ;
  sigchld_action.sa_handler = &clean_up_child_process ;

  sigaction ( SIGCHLD, &sigchld_action, NULL ) ;

  /* Now do things, including forking a child process */
  child_pid = fork () ;

  if ( child_pid > 0 ) {
    sleep ( 60 ) ; // it ends after only 15 seconds
  } else {
    sleep ( 15 ) ;
  exit (0) ;
  }

  printf ( "%d\n", child_exit_status ) ;
  return 0 ;
}

我的猜测是该程序大约需要60秒才能完成。但是实际发生的是:一旦启动,它在子进程终止后仅运行约15秒。我不知道为什么sleep ( 60 )不能使主进程持续一会儿,或者被wait()函数中断。

1 个答案:

答案 0 :(得分:5)

如果您阅读a sleep manual page,将会看到该功能

  

睡眠直到数          以秒为单位指定的实时秒已过去或直到信号          到达而不会被忽略

[重点突出]

由于您不会忽略SIGCHLD信号,因此sleep函数将在子级退出且父级进程获得该信号时中断。