CmdChannel昨天移植到Ubuntu上,功能都OK,就是發現CPU有點不對,怎么一直在90%的使用率呢?但為什么在Windows下運行是正常的呢?
struct timeval val;
fd_set rd;
int maxfd = -1;
int ret = 1;

val.tv_sec = 0;
val.tv_usec = 1000;

cc_Global.telnet.run = 1;
while(cc_Global.telnet.run)

{
maxfd = cc_TelnetServer_SetFd(&rd);

ret = select(maxfd + 1, &rd, NULL, NULL, &val);

if(ret > 0)


想來是select的問題,因為select本來就是放置100%CPU的。對著幫助文檔,先檢查maxfd,沒錯啊,再檢查rd,然后是timeval,也沒有錯啊~是timeval設定的太短?換成val.sec = 5,問題依舊~
折騰很久,突然發現,while循環在第一次運行時是有間隔的,但其后就開始100%了。突然想起,使用select的一個注意事項就是fdset每次要重新設置,因為select函數會修改其值。那么timeval也是如此嗎?于是修改代碼:
struct timeval val;
fd_set rd;
int maxfd = -1;
int ret = 1;

cc_Global.telnet.run = 1;
while(cc_Global.telnet.run)

{
maxfd = cc_TelnetServer_SetFd(&rd);

val.tv_sec = 0;
val.tv_usec = 1000;

ret = select(maxfd + 1, &rd, NULL, NULL, &val);

if(ret > 0)

果然如此,timeval被select函數清零了~
查看select函數的原型:
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
其timeout確實不是一個const量。。。
windows和unix下的函數間的微小差異害死人啊~