Не нарушает ли wait () основной процесс? - PullRequest
0 голосов
/ 04 сентября 2018

Ниже приведена основная часть моего кода (взято из "расширенного программирования под Linux", листинг 3.7):

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 голосов
/ 04 сентября 2018

Если вы прочитаете a sleep страницу руководства , вы увидите, что функция

спать либо до числа секунды в реальном времени, указанные в секундах, истекли или до сигнала прибывает, который не игнорируется .

[Выделение мое]

Поскольку вы не игнорируете сигнал SIGCHLD, функция sleep будет прервана, когда дочерний процесс завершится, и родительский процесс получит сигнал.

...