出在 recv 上的一个 bug
今天 卡牌对决 新版本发布,几乎都已经更新包放出来了,突然发现了 bug 。那个紧张哦,好在临危不乱 :) 用了半小时仔细阅读代码,找出了 bug 。
由于这次需要部署多个网络接入点,解决网通、电信、教育网互联的问题。我申请了各个网络的多台机器。新申请的机器是跑的 debian/linux ,而不是我们开发时用的 freebsd 。一个以前在 freebsd 上跑的正常的程序,放在 linux 出了问题,一开始让我很不解。
仔细查看后,发现 bug 出在一个 recv 调用上。用 gdb attach 到锁死的进程中,确认果然是一处 recv 调用没有返回。
原来,一旦用阻塞方式去 recv 0 字节长度。比如:
recv(fd,buf,0,MSG_WAITALL);
在 linux 上,系统调用就会一直阻塞而不返回了。
经同事验证,freebsd 上这样做,调用会返回 0 ,并设置一个奇怪的 errno 。但这种行为不会导致程序的行为错误。
当然,这是一个程序实现的 bug ,recv 传长度 0 一种结果未定义的行为。只是我觉得 freebsd 的行为要人性一点,呵呵。
btw, 这两天发现,debian 下默认的 syslogd 不太好用。居然不能像 freebsd 下的那样,配置成按 ident 字符串过滤。怪不得在 linux 下开发的同事没有使用 syslog 输出 log 的习惯。
或者,是我不会用?
Comments
Posted by: 福利工口姬 | (10) April 16, 2014 04:22 PM
Posted by: 云枫 | (9) March 5, 2009 10:15 AM
Posted by: Anonymous | (8) February 9, 2009 10:44 AM
Posted by: apache | (7) February 5, 2009 10:55 AM
Posted by: Anonymous | (6) January 31, 2009 08:51 AM
Posted by: luluandme | (5) January 16, 2009 08:58 AM
Posted by: dingdeng | (4) January 16, 2009 04:57 AM
Posted by: Cloud | (3) January 16, 2009 12:21 AM
Posted by: altchen | (2) January 15, 2009 10:55 PM
Posted by: jesusjobs | (1) January 15, 2009 10:13 PM