select()
最近碰到一點小小厘清。
select 時間塞給他NULL跟0的差別。
什麼? 0 跟 NULL 不是ㄧ樣嗎?不ㄧ樣就是不ㄧ樣,筆畫還差很多咧。
如果資料一直在進FD倒是沒差太多,如果資料斷斷續續你又擺了個while LOOP,
那就會有很討厭的現象了,最近差點被dev沒回應搞死Orz
從"函式庫辭典挖ㄧ段"來寫程式證明:
--
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
int main(void)
{
fd_set rfds;
struct timeval tv;
int retval;
char buf[1024];
bzero(buf, sizeof(buf));
while(1)
{
FD_ZERO(&rfds);
FD_SET(0, &rfds);
tv.tv_sec = 0;
tv.tv_usec = 0;
retval = select(1, &rfds, NULL, NULL, &tv);
if(retval == -1)
perror("select error !!!\n");
else if(retval)
printf("Data is available NOW!!\n");
if(FD_ISSET(0, &rfds))
{
read(0, buf, sizeof(buf));
printf("Message: %s \n", buf);
break;
}else
printf("No date\n");
}
return 0;
}
--
給0的時候馬上就回報FD沒有資料可以讀取
--
retval = select(1, &rfds, NULL, NULL, NULL);
給NULL的時候會select會停住直到FD有資料可用。
是有一點點差別的。
PS.
通常都會這樣寫,另外弄一個*tvp增加彈性
(sec, usec 秒數是相加)
struct timeval tv, *tvp;
if(XXX)
tvp = NULL;
else
tvp = &tv
tv.tv_sec = secs;
tv.tv_usec = tv.tv_sec/1000000;
tv.tv_usec %= 1000000;
retval = select(1, &rfds, NULL, NULL, tvp);
沒有留言:
張貼留言