linux waitpid实例,linux wait 和waitpid(示例代码)

背景:在读unix网络编程卷1, 第五章服务器处理SIGCHLD信号时。及多个客户端同时关闭socket连接,服务端主进程的多个子进程几乎同时结束。

使用wait 的情况:

void sig_chld(intsigno)

{

pid_t pid;intstat;

pid= wait(&stat);return;

}

d627b4d1c55c4cfaafe29bd17334b382.jpg

当服务端采用并发处理客户端的请求时,客户进程关闭连接,服务端子进程几乎同时结束,信号处理函数在使用wait时,并不能完全的防止僵尸进程的出现,问题在于,信号处理函数在处理第一个进程的SIGCHLD信号时,后面的四个进程也发来了SIGCHLD信号,但是信号是不排队的,这样就会导致信号丢失,这样会产生很多的僵尸进程。书中的解决办法是采用waitpid 循环判断。

采用waitpid:

void sig_chld(intsigno)

{

pid_t pid;intstat;while((pid = waitpid(-1, &stat, WNOHANG)) > 0){

printf("child %d terminated\n", pid);

}return;

}

看到这段代码,开始陷入了困惑,在sig_chld执行期间,后面的信号不也被忽略了吗? 为什么能防止僵尸进程?  其实不是这样的,waitpid 当第一个参数为-1 时,表示等待任何子进程,参数WNOHANG表示非阻塞wait。该函数循环等待所有的子进程,man手册的关于该函数的返回值也讲的很清楚,如果成功,返回子进程的id。当指定了WNOHANG 并且有一个或者多个子进程仍然存在,并且进程状态没有改变,即返回0. 因此sig_chld只要触发了,就会一直循环,直到所有的子进程都被处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值