以下是我的代码的主要部分(摘自清单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()
函数中断。
答案 0 :(得分:5)
如果您阅读a sleep
manual page,将会看到该功能
睡眠直到数 以秒为单位指定的实时秒已过去或直到信号 到达而不会被忽略。
[重点突出]
由于您不会忽略SIGCHLD
信号,因此sleep
函数将在子级退出且父级进程获得该信号时中断。