函式原型為:
int select(intmaxfdpl, fd_set * readfds, fd_set *writefds,
fd_set * read exceptfds, struct timeval* tvptr);
1、前面文章已詳細解釋最後乙個引數,表示超時的引數,但是在除錯過程中發現設定了超時時間,但只有第一次
select
的時候起作用,以後每次都是立即返回超時,和超時時間設為
0效果一樣,通過查閱相關資料發現
select()
函式內部不斷更新
tvptr
的值,以檢視超時時間還剩多少,如果不在每次呼叫
select
函式前給
tvptr
賦值,那麼第一次呼叫之後,
tvptr
的值就被更新至
0了,以後不管你再呼叫它多少次,
select()
都會立即返回了。 2
、每次呼叫
select
函式前都要把所檢測的檔案描述符集合清空,重新賦值,否則檢測不到檔案描述符的變化。
3、前面文章只對第二個、第三個引數做了介紹,第四個引數是檢測描述符異常的集合。
fd_set * read exceptfds, struct timeval* tvptr);
select函式總結
阻塞方式block,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果事件沒有發生,程序或執行緒就被阻塞,函式不能立即返回。使用select就可以完成非阻塞non block,就是程序或執行緒執行此函式時不必非要等待事件的發生,一旦執行肯定返回,以返回值的不同來反映函式的執 況,如果事件...
select 函式 使用
告知核心等待某一或某些事件發生 而後喚醒程序 或超時返回 int select int maxfdp1,fd set readset,fd set writeset,fd set excepset,const struct timeval timeout 返回準備好的描述符數量 超時返0錯誤 1 主...
select函式使用
這兩天寫了這麼一段 select直接返回 1,錯誤資訊是 invalid argments 顯然沒有達到阻塞超時的效果。如下 bool issocketwaitread inf fd,int usec 這段 在標準的linux環境可以執行,但是在arm體系架構的國產化作業系統下,返回值永遠是 1 修...