select可以監控多個檔案控制代碼,監控檔案內容的變化,比如可讀可寫狀態的改變,利用select可以實現非阻塞而不會讓執行緒掛起,提高系統的執行效率。
比如可以同時 監控 鍵盤輸入和滑鼠輸入,如果鍵盤有訊號,可以去操作鍵盤,如果滑鼠有訊號,去處理滑鼠事件,如果都沒有訊號,則可以不讓執行緒掛起而繼續向下執行。
1、 所需標頭檔案:
#include
#include
#include
2、函式原型
int select(int numfds,fd_set *readfds, fd_set *writefds,fd_set *exeptfds, struct timeval *timeout)
numfds:需要檢查的號碼最高的檔案描述符加 1
readfds:由 select()監視的讀檔案描述符集合
writefds:由 select()監視的寫檔案描述符集合
exeptfds:由 select()監視的異常處理檔案描述符集合
timeout
struct timeval
null:永遠等待,直到捕捉到訊號或檔案描述符已準備好為止
具體值:struct timeval 型別的指標,若等待為 timeout 時間還沒有檔案描符準備好,就立即返回
0:從不等待,測試所有指定的描述符並立即返回
函式返回值
成功:準備好的檔案描述符
−1:出錯
3.、select 檔案描述符處理函式
fd_zero(fd_set *set) 清除乙個檔案描述符集
fd_set(int fd,fd_set *set) 將乙個檔案描述符加入檔案描述符集中
fd_clr(int fd,fd_set *set) 將乙個檔案描述符從檔案描述符集中清除
fd_isset(int fd,fd_set *set) 測試該集中的乙個給定位是否有變化
使用步驟:
1、定義檔案描述符
如:int int fds[2];
然後:fds[0] = open(....),開啟檔案。
2、定義要監視的集合
如:fd_set inset1,inset2;
初始化集合: fd_zero(&inset1);
把要監視的檔案描述符新增進集合: fd_set(fds[0],&inset1); 可以新增多個。
0:從不等待
null:永遠等待
定義時間結構體:
struct timeval tv;
設定時間,如:
tv.tv_sec=2;
tv.tv_usec=0;
注意當每次迴圈執行到select時,原來tv的值會被清零,必須重新設定
4、取出最大的那個檔案
maxfd = fds[0]>fds[1] ? fds[0] : fds[1];
5、設定select(maxfd+1,&inset1,&inset2,null,&tv)
6、如果select返回大於0
可以用fd_isset(fds[0],&inset1)測試是哪個個檔案的狀態的變化。
測試程式,監視 標準輸入,然後列印出來
[cpp]view plain
copy
#include
#include
#include
#include
#include
#include
intmain()
else
if(fd_isset(stdin_fileno, &rfds))
//測試是否有資料
printf("you input is %s\n"
,buf);
} else
} return
0;
}
執行結果:
[cpp]view plain
copy
root@lj:/work/tmp/select/keypad# gcc select_key.c -o select
root@lj:/work/tmp/select/keypad# ./select
hello
you input is hello
time out: 1
time out: 2
time out: 3
js jquery中select的用法
1.js var obj document.getelementbyid selectid obj.options.length 0 清除所有內容 obj.options index new option three 3 更改對應的值 obj.options index selected true ...
linux下select和poll的用法
select 函式的作用 系統呼叫select和poll的後端實現,用這兩個系統呼叫來查詢裝置是否可讀寫,或是否處於某種狀態。如果poll為空,則驅動裝置會被認為即可讀又可寫,返回值是乙個狀態掩碼 如何使用select 函式?select 函式的介面主要是建立在一種叫 fd set 型別的基礎上。它...
Linux下select和poll的用法
select 函式的作用 系統呼叫select和poll的後端實現,用這兩個系統呼叫來查詢裝置是否可讀寫,或是否處於某種狀態。如果poll為空,則驅動裝置會被認為即可讀又可寫,返回值是乙個狀態掩碼 如何使用select 函式?select 函式的介面主要是建立在一種叫 fd set 型別的基礎上。它...