2004-4-16 18:23
zerocold
在aix4.3上写了个服务段程序,代码大致如下:<br /><br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--><br /><br />int DoDeal()<br />{<br /> for(;;)<br /> {<br /> if (accept() < 0)<br /> {<br /> fprintf(stderr, "errmsg = [%d][%s]\n", errno, strerror(errno)); <br /> return -1;<br /> }<br /> <br /> Recv();<br /> CloseTcp();<br /> }<br />}<br /><br />int main()<br />{<br /> int i;<br /> CreateLisntenSock();<br /><br /> for(i = 0; i < 10; i ++)<br /> {<br /> if (fork() == 0)<br /> {<br /> DoDeal();<br /> exit(1);<br /> }<br /> }<br /><br /> exit(0);<br />}<br /><!--c2--></div><!--ec2--><br /><br /><br />当客户端向服务端发起请求时,服务程序的其中一个进程可以正常处理客户端请求,其他子进程由于"惊群"导致 accept 出错(errno为EAGAIN 或者 ENOTCONN),但理论上 accept 由于 "惊群" 应该会重新进入休眠状态,但在这里且出错, 不知道是不是操作系统的问题,对accept加锁就没问题了。 同样的程序(没有对accept加锁)在SCO上测试 正常,accept 没有出错(虽然存在 "惊群" ) 。