Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C wait()是否会中断主进程?_C_Fork_Child Process - Fatal编程技术网

C wait()是否会中断主进程?

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

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

我猜想这个程序大约需要60秒才能完成。然而,实际发生的情况是:一旦启动,它在子进程终止后仅运行约15秒。我想知道为什么
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 ;
}