Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57314
  • 博文数量: 8
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 88
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-13 16:18
个人简介

不积跬步无以至千里,不积小流无以成江河。

文章分类
文章存档

2014年(8)

我的朋友

分类: 其他平台

2014-10-23 15:34:49

在osx系统中有一个奇怪的现象,就是在子进程退出的时候waitpid会被中断一次,errno返回EINTR号,如果给SIGCHLD改成自己的实现就不会出现这种情况,不知道osx的darwin内核对SIGCHLD的默认处理做了什么。


点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <signal.h>
  6. #include <termios.h>
  7. #include <errno.h>


  8. int chld = 0;
  9. void sig_chld(int signo) {
  10.     chld = 1;
  11. }
  12. int main(){
  13.     
  14.     pid_t pid ,errnopid = 0;
  15.     int status = 0;
  16.     //signal(SIGCHLD, sig_chld);
  17.     if( 0 > ( pid = fork())){
  18.         printf("fork error\n");
  19.     }else if( 0 == pid) {
  20.         printf("child\n");
  21.         sleep(10);
  22.         exit(123);
  23.     }
  24.     while ((errnopid = waitpid(pid, &status, 0)) != pid) {
  25.         if( EINTR == errno)
  26.             printf("EINTR = %d , status = %d , chld %d\n",errnopid,status,chld);
  27.     }
  28.     printf("pid = %d , status %d ,errnopid %d \n",pid,status,errnopid);
  29.     return 0;
  30. }

Output:
child
EINTR = -1 , status = 0 , chld 0
pid = 5854 , status 31488 ,errnopid 5854

这里使用while的话可以处理这种情况的。

阅读(2896) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:apue中system为什么要阻塞SIGCHLD的原因。

给主人留下些什么吧!~~