posts - 264,  comments - 573,  trackbacks - 8

随笔分类

文章分类

相册

收藏夹

Weblogs

搜索

  •  

最新评论

早就看到原来的程序太土了,本想那个无所谓,就没去改。但现在主要是过分影响效率,矛盾才出来,要求解决。原来居然是用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)  编辑 收藏
标题  
姓名  
主页
内容   
请输入验证码:
*
  登录  使用高级评论  Top 订阅回复  取消订阅
[使用Ctrl+Enter键可以直接提交]