Linux下的select,注意咯,不是pselect。
select()函數的最後一個參數是timeout,用來設置超時用的。
用的是一個struct timeval結構,需要用到sys/time.h文件。
struct timeval {
long tv_sec; 秒
long tv_usec; 毫毛
}
設置了timeout的值之後呢,select在沒有文件描述符監視可用的情況下,會等待這個timeout的時間,時間到了select返回0
如果timeout超時之前有文件描述符可用,則返回可用的數量,這時候的timeout則會依然計數,因此如果想要每次都超時一定的時間那麼在slelect返回>0的值之後要重新裝填timeout的值一次。www.linuxidc.com以保證超時時間沒有變化。
如果tv_sec和tv_usec都是0,那麼就是超時時間為0,那麼select就會立刻返回了。
如果timeout這裡是個NULL,那麼超時就未被啟用,會一直阻塞在監視文件描述符的地方。
在pselect中的timeout更牛X
用到了struct timespec {
long tv_sec; 秒
long tv_nsec; 納秒
}
時間更精確。
當然了系統做不了這麼精確的事情,一般Linux的系統精度也就是10ms左右了。
這裡說的重點在於timeout的值的選擇和處理上。
另外遇到的一個問題是信號SIGALRM會使得select返回-1並置errno為EINTR。但這個信號已經被我的sigaction干掉了函數處理了,這個問題還需要研究一下。