Ниже приведена основная часть моего кода (взято из "расширенного программирования под 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()
.