linux wait 和waitpid
2016-03-24 18:48
411 查看
背景:在读unix网络编程卷1, 第五章服务器处理SIGCHLD信号时。及多个客户端同时关闭socket连接,服务端主进程的多个子进程几乎同时结束。
使用wait 的情况:
当服务端采用并发处理客户端的请求时,客户进程关闭连接,服务端子进程几乎同时结束,信号处理函数在使用wait时,并不能完全的防止僵尸进程的出现,问题在于,信号处理函数在处理第一个进程的SIGCHLD信号时,后面的四个进程也发来了SIGCHLD信号,但是信号是不排队的,这样就会导致信号丢失,这样会产生很多的僵尸进程。书中的解决办法是采用waitpid 循环判断。
采用waitpid:
看到这段代码,开始陷入了困惑,在sig_chld执行期间,后面的信号不也被忽略了吗? 为什么能防止僵尸进程? 其实不是这样的,waitpid 当第一个参数为-1 时,表示等待任何子进程,参数WNOHANG表示非阻塞wait。该函数循环等待所有的子进程,man手册的关于该函数的返回值也讲的很清楚,如果成功,返回子进程的id。当指定了WNOHANG 并且有一个或者多个子进程仍然存在,并且进程状态没有改变,即返回0. 因此sig_chld只要触发了,就会一直循环,直到所有的子进程都被处理。
使用wait 的情况:
void sig_chld(int signo) { pid_t pid; int stat; pid = wait(&stat); return; }
当服务端采用并发处理客户端的请求时,客户进程关闭连接,服务端子进程几乎同时结束,信号处理函数在使用wait时,并不能完全的防止僵尸进程的出现,问题在于,信号处理函数在处理第一个进程的SIGCHLD信号时,后面的四个进程也发来了SIGCHLD信号,但是信号是不排队的,这样就会导致信号丢失,这样会产生很多的僵尸进程。书中的解决办法是采用waitpid 循环判断。
采用waitpid:
void sig_chld(int signo) { pid_t pid; int stat; 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只要触发了,就会一直循环,直到所有的子进程都被处理。
相关文章推荐
- http://blog.csdn.net/wxwzy738/article/details/16968767
- UVALive 6555 Playing Fair with Cryptography(细节处理)
- IBATIS的工作原理(1)(http://blog.csdn.net/chen861201/article/details/7614201)
- LeetCode Algorithms #24 <Swap Nodes in Pairs>
- 动态分析maillog日志,把恶意链接直接用防火墙禁止
- 史上最详细的centos下 postfix + extmail + dovecot + maildrop 安装笔记
- LeetCode 336 Palindrome Pairs(回文串)
- 安卓跨进程通信之AIDL使用入门
- Codeforces 306C White, Black and White Again (简单计数)
- RabbitMQ消息队列(一): Detailed Introduction 详细介绍
- Rails教程
- ArtifactdescriptorException: failed to read artifact for xxxxxx.
- 引导层界面的Canvas和Paint效果
- KeyChain
- openCV中waitKey函数介绍
- leveled学习
- Thumbnailator使用简介
- Hadoop之为何不使用RAID?
- 用keychain(钥匙串)保存用户名和密码
- Rails 3 修改url中默认的的/:id