发信人: debug (还有3天), 信区: Linux
标 题: FB3(19991203)一个严重的BUG
发信站: 幽幽黄桷兰(cqupt) (Mon Apr 24 22:42:14 2000), 转信
在我的系统经历折磨后,我才不得不相信FB3(19991203)竟然有
这种BUG。该BUG会导致系统在负荷比较重的情况下导致系统崩溃。
在bbsd.c中有一段代码:
.......
pid = fork();
^^^^^^^^^^^^^
#ifdef HAVE_CHKLOAD
if (overload) {
(void) write(csock, genbuf, strlen(genbuf));
(void) close(csock);
continue;
^^^^^^^^
}
#endif
if (!pid) {
........
问题就出在fork()和contine这两个地方.如果服务器的状态
一直很好,也就是不产生overload,那么代码一直执行倒没有
什么问题.但是本身系统负担比较重,在某一时刻产生了overload,
问题就大大了.由于在判断overload前就使用了fork函数,产生
了一个子进程,但现在是overload,系统把socket关了后就
立刻回到主循环中.也就是说前一句产生的子进程根本没有
释放,而且没有释放这个进程的机会!
所以有些BBS到了上站高峰期后,用户一登陆,就立刻返回了BBSD
的进程号(当然如果系统的最大进程数超出了也会这样),然后再也
连不上了。
消灭BUG的方法:
把pid=fork()一句放到#endif之后。
--
FROM 202.202.43.69