2010年3月23日 星期二

[語言] Select 小紀末

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);

沒有留言:

張貼留言