Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5771619
  • 博文数量: 675
  • 博客积分: 20301
  • 博客等级: 上将
  • 技术积分: 7671
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-31 16:15
文章分类

全部博文(675)

文章存档

2012年(1)

2011年(20)

2010年(14)

2009年(63)

2008年(118)

2007年(141)

2006年(318)

分类: C/C++

2007-11-24 18:58:16

    一般我们在程序设计的时候,我们使用wait来获取子进程的退出状态,但是wait将会阻塞等到子进程结束。对于waitpid来说:
    pid_t waitpid(pid_t pid, int *statloc, int options);
我们可以通过设置第3个参数options为WNOHANG来使waitpid为非阻塞,但这样的话,我们就需要不断的调用waitpid来探测子进程是否结束。

    signal中有一个SIGCHLD,当一个进程终止或停止时,将SIGCHLD信号发送给其父进程。按照系统默认情况,这个信号是被忽略的。如果父进程希望被告知其子进程的这种状态的变化,则应该设置捕获这个信号。在信号处理函数里面,通常要调用一种wait来获取子进程的ID和其退出状态。

#include
#include
#include
#include
#include

sig_atomic_t child_exit_status;

void clean_up_child_process (int signal_number)
{
  /* Clean up the child process.  */
  int status;
  wait (&status);
  /* Store its exit status in a global variable.  */
  child_exit_status = status;
}

int main ()
{
  pid_t pid;
  /* Handle SIGCHLD by calling clean_up_child_process.  */
  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.  */
  /* ...  */
  pid = fork();
  if(pid == 0)
  {
          printf("In Child:\n");
          sleep(5);
  }
  else
  {
          printf("In Parent:\n");
          sleep(10);
          printf("Child Return Status: %d\n", child_exit_status);
  }

  return 0;
}
运行结果为:
wangyao@fisherman:~/Desktop/Advanced Linux Programming/ALP-listings/chapter-3$ ./a.out
In Child:
In Parent:
Child Return Status: 0

阅读(3716) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~