linux中select的用法

2021-06-22 17:14:48 字數 2240 閱讀 8705

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 型別的基礎上。它...