C wait()是否会中断主进程?
以下是我代码的主要部分(采用“高级linux编程”,清单3.7): 我猜想这个程序大约需要60秒才能完成。然而,实际发生的情况是:一旦启动,它在子进程终止后仅运行约15秒。我想知道为什么C wait()是否会中断主进程?,c,fork,child-process,C,Fork,Child Process,以下是我代码的主要部分(采用“高级linux编程”,清单3.7): 我猜想这个程序大约需要60秒才能完成。然而,实际发生的情况是:一旦启动,它在子进程终止后仅运行约15秒。我想知道为什么sleep(60)不会导致主进程持续一段时间,或者它被wait()函数中断。如果您阅读,您将看到该函数 要么睡到 以秒为单位指定的实时秒数已过或直到信号发出 到达时不被忽略 [我的重点] 由于您没有忽略SIGCHLD信号,因此当子进程退出并且父进程获得该信号时,sleep功能将被中断。如果您阅读,您将看到该函数
sleep(60)
不会导致主进程持续一段时间,或者它被wait()
函数中断。如果您阅读,您将看到该函数
要么睡到
以秒为单位指定的实时秒数已过或直到信号发出
到达时不被忽略
[我的重点]
由于您没有忽略SIGCHLD
信号,因此当子进程退出并且父进程获得该信号时,sleep
功能将被中断。如果您阅读,您将看到该函数
要么睡到
以秒为单位指定的实时秒数已过或直到信号发出
到达时不被忽略
[我的重点]
由于您没有忽略
SIGCHLD
信号,因此当子进程退出并且父进程获得信号时,sleep
功能将被中断。您没有检查sleep()
的返回值,因此您没有理由知道睡眠是否成功,在后一种情况下,为什么。引用Linux手册页中的话,sleep
返回“如果请求的时间已过,或者如果调用被信号处理程序中断,剩余的睡眠秒数为零。”您没有检查sleep()
的返回值,因此您没有理由知道睡眠是否成功,在后一种情况下,为什么。引用Linux手册页中的话,sleep
返回“如果请求的时间已过,则返回零;如果调用被信号处理程序中断,则返回剩余的睡眠秒数。”
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 ;
}