CmdChannel昨天移植到Ubuntu上,功能都OK,就是發(fā)現(xiàn)CPU有點(diǎn)不對(duì),怎么一直在90%的使用率呢?但為什么在Windows下運(yùn)行是正常的呢?
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)


想來(lái)是select的問(wèn)題,因?yàn)閟elect本來(lái)就是放置100%CPU的。對(duì)著幫助文檔,先檢查maxfd,沒(méi)錯(cuò)啊,再檢查rd,然后是timeval,也沒(méi)有錯(cuò)啊~是timeval設(shè)定的太短?換成val.sec = 5,問(wèn)題依舊~
折騰很久,突然發(fā)現(xiàn),while循環(huán)在第一次運(yùn)行時(shí)是有間隔的,但其后就開(kāi)始100%了。突然想起,使用select的一個(gè)注意事項(xiàng)就是fdset每次要重新設(shè)置,因?yàn)閟elect函數(shù)會(huì)修改其值。那么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函數(shù)清零了~
查看select函數(shù)的原型:
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
其timeout確實(shí)不是一個(gè)const量。。。
windows和unix下的函數(shù)間的微小差異害死人啊~