父进程非阻塞回收子进程(适用LINUX下C语言的clientserver模型)

摘要:
众所周知,子进程退出后,其父进程需要通过wait或waitpid从子进程中收集一些资源。一般的回收机制属于阻断回收。父进程阻塞并等待子进程接收子进程的退出状态。然而,我需要在实验中实现的是客户机-服务器模型。父进程属于守护进程。它启动TCP套接字并等待链接。每当请求到来时,它都会分叉一个子进程来传输信息并自由退出。在此模型中,父进程无法阻止和回收子进程,或者无法保证其他请求正常到达。

      众所周知,子进程退出后(不管是正常还是异常退出),其父进程需要通过wait或waitpid来回收子进程的一些资源。回收是没有疑义的,但是父进程在哪儿回收,以什么方式回收,却影响着设计思路和效率。

       一般的回收机制都属于阻塞回收,父进程阻塞等待子进程技术,收到子进程的退出状态。然而在实验中我需要实现的属于client-server模型。父进程 属于守护进程一类,开启TCP套接字等待链接,每当有请求到来,便fork一个子进程传输信息并自由退出。父进程并不关注子进程的退出状态,是否正常都不 影响今后的服务,但子进程变成僵尸进程便麻烦了,随着时间的进行,僵尸进程一大堆,虽然占用资源不多,但终究是个隐患。

在这个模型里,父进程是不能阻塞回收子进程的,不然不保证其他请求可以正常到达。
解决办法:
1、建立信号处理handle   
signal(SIGCHLD, sigchld_handler);
2、信号处理handle的实现

static void sigchld_handler(int signo)
{
pid_t pid;
pid = waitpid(-1, &waiter, WNOHANG);
}

这里有几点需要解释:
1)这里采用waitpid,说明不能阻塞;
2)-1表示回收任意子进程;
3)WNOHANG表示不阻塞。

父进程:(父进程在信号处理hanlde中回收子进程)

int main(void)
{
signal(SIGCHLD, sigchld_handler);//加了个子程序退出的信号
signal(SIGINT, sigint_handler); //收到CTRL-C的信号
signal(SIGTERM, sigint_handler);
......
while (1)
{
......
if((pid = fork() )< 0)
return 1;
else if(pid == 0)
{
....//子进程
}
}
return 0;
}

转载: http://hi.baidu.com/%D3%EA%BA%E7%D1%F4/blog/item/6490202aaba49193023bf633.html

免责声明:文章转载自《父进程非阻塞回收子进程(适用LINUX下C语言的clientserver模型)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Windows 查看某个端口号是否被占用Java基础笔记(四)——命名规则、数据类型下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[Tomcat/Java EE/Linux]Tomcat启动异常:StandardServer.await: create[localhost:8005]: java.net.BindException: 无法指定被请求的地址

1 问题背景 部门新成员小J在一台虚拟机(ip:192.168.191.96)内安装部署部门的数据治理产品(含: 20余个微服务模块 + 1套(用户)基础管理系统BMS)。 小J启动BMS的Tomcat时,屡次报此错:StandardServer.await: create[localhost:8005]: java.net.BindException...

linux时区时间问题

同步网络时间(需要连接互联网) 参考:https://blog.csdn.net/mjp_erhuo/article/details/83895177 linux使用tzselect调整时区 首先tzselect,选择数字Asia,China,Shanghai,输入1; 复制 vim /etc/profile 最后一行添加 TZ='Asia/Shangha...

linux下离线安装svn服务器并配置

一、下载相应的包 subversion-1.8.18.tar.gz   下载地址:http://subversion.apache.orgsqlite-autoconf-3190300.tar.gz 下载地址:http://www.sqlite.orgapr-1.5.2.tar.gz,apr-util-1.5.4.tar.gz 下载地址:http://ar...

Linux内核调试方法总结之backtrace

backtrace 【用途】用户态或者内核态程序异常退出时回溯堆栈信息 【原理】通过对当前堆栈的分析,回溯上层函数在当前栈中的帧地址,直至顶层函数。帧地址是指在栈中存在局部变量、上一级函数返回地址、寄存器值的内存空间。由于不同处理器堆栈实现不同(向上增长和向下增长),此功能的具体实现是编译器内建的__buildin_frame_address及__buil...

Linux套接字与虚拟文件系统(1):初始化和创建

http://www.cppblog.com/qinqing1984/archive/2015/05/03/210521.html 引言在Unix的世界里,万物皆文件,通过虚拟文件系统VFS,程序可以用标准的Unix系统调用对不同的文件系统,甚至不同介质上的文件系统进行读写操作。对于网络套接字socket也是如此,除了专属的Berkeley Sockets...

linux配置SOCK5代理

一.llinux环境安装 yum update yum install pam-devel openldap-devel openssl-devel yum -y install gcc yum -y install gcc-c++ 二.sock5安装 cd /opt wget http://downloads.sourceforge.net/pr...