早就看到原来的程序太土了,本想那个无所谓,就没去改。但现在主要是过分影响效率,矛盾才出来,要求解决。原来居然是用ps 命令去查看进程数来判断,但ps命令执行起来是很慢的,特别是主机进程比较多时。从最小、最简单改动原则出发,初步采用信号判断即可,稍微总结一下:
1、采用SIGCLD捕获子进程退出信号,控制减少计数
2、创建子进程后控制增加计数
3、子进程判断最大进程个数并处理(避免fork前时间太长)
4、测试发现accept会被信号中断,如果是信号中断,就不写错误日志
大意关键部分描述如下:
signal(SIGCLD,CHILDOUT);
while(1) do
{
if ( (sockid=accept(....)) == -1 ) {
if (errno == EINTR) continue;//子进程sigcld时会引发该错,因快速返回
WriteErrorLog;
contiue;
}
case(pid=fork())
{
-1:error
=0:if(childnum>MaxNum) senderror(exceed....) else dowork;
>0:childnum++;
}
}
void CHILDOUT(int signo)
{
childnum--;
signal(signo,CHILDOUT);
}
posted on 2008-11-21 23:23 dragonimp 阅读(373)
评论(0) 编辑 收藏