linux select具體解釋

2021-09-08 03:47:54 字數 2751 閱讀 4893

linux—select

具體解釋

select

系統呼叫時用來讓我們的程式監視多個檔案控制代碼的狀態變化的。程式會停在

select

這裡等待,直到被監視的檔案控制代碼有乙個或多個發生了狀態改變。

關於檔案控制代碼,事實上就是乙個整數,通過

socket

函式的宣告就明確了:

int socket(int domain, int type, int protocol);

我們最熟悉的控制代碼是0、

1、2三個,

0是標準輸入,

1是標準輸出,

2是標準錯誤輸出。0、

1、2是整數表示的,相應的

file *

結構的表示就是

stdin

、stdout

、stderr。

繼續上面的

select

,就是用來監視某個或某些控制代碼的狀態變化的。

select

函式原型例如以下:

int select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

函式的最後乙個引數

timeout

是乙個超時時間值。其型別是

struct timeval *

,即乙個

struct timeval

結構的變數的指標,所以我們在程式裡要宣告乙個

struct timeval tv;

然後把變數

tv的位址

&tv傳遞給

select

函式。struct timeval

結構例如以下:

struct timeval;第

2、3、

4三個引數是一樣的型別

;fd_set *,

即我們在程式裡要申請幾個

fd_set

型別的變數,比方

rdfds

,wtfds

,exfds

,然後把這個變數的位址

&rdfds,&wtfds,&exfds

傳遞給select

函式。這三個引數都是乙個控制代碼的集合,第乙個

rdfds

是用來儲存這種控制代碼的

:當控制代碼的狀態變成可讀時系統就告訴

select

函式返回,同理第二個函式是指向有控制代碼狀態變成可寫時系統就會告訴

select

函式返回,同理第三個引數

exfds

是特殊情況,即控制代碼上有特殊情況發生時系統會告訴

select

函式返回。特殊情況比方對方通過乙個

socket

控制代碼發來了緊急資料。假設我們程式裡僅僅想檢測某個

socket

是否有資料可讀,我們能夠這樣:

fd_set  rdfds;

struct timeval tv;

int ret;

fd_zero(&rdfds);

fd_set(socket, &rdfds);

tv.tv_sec = 1;

tv.tv_uses = 500;

ret = select (socket + 1, %rdfds, null, null, &tv);

if(ret < 0) perror (「select」);

else if (ret = = 0) printf(「time out」);

else }注意

select

函式的第乙個引數,是全部增加集合的控制代碼值的最大那個那個值還要加

1.比方我們建立了

3個控制代碼;

int sa, sb, sc;

sa = socket(……);

connect (sa,….);

sb = socket(….);

connect (sb,…);

sc = socket(….);

connect(sc,…);

fd_set(sa, &rdfds);

fd_set(sb, &rdfds);

fd_set(sc, &rdfds);

在使用select

函式之前,一定要找到

3個控制代碼中的最大值是哪個,我們一般定義乙個變數來儲存最大值,取得最大

socket

值例如以下:

int maxfd = 0;

if(sa > maxfd) maxfd = sa;

if(sb > maxfd) maxfd = sb;

if(sc > maxfd) maxfd = sc;

然後呼叫

select

函式:ret = select (maxfd+1, &rdfds, null, null,&tv);

相同的道理,假設我們是檢測使用者是否按了鍵盤進行輸入,我們就應該把標準輸入

0這個控制代碼放到

select

裡來檢測,例如以下:

fd_zero(&rdfds);

fd_set(0, &rdfds);

tv.tv_sec = 1;

tv.tv_usec = 0;

ret = select (1, &rdfds,null,null,&tv);

if(ret < 0) perror(「select」);

else if (ret = = 0) printf (「time out/n」);

else

linux diff具體解釋

diff是unix系統的乙個非常重要的工具程式。它用來比較兩個文字檔案的差異,是 版本號管理的基石之中的乙個。你在命令列下,輸入 diff 變動前的檔案 變動後的檔案 diff就會告訴你,這兩個檔案有何差異。它的顯示結果不太好懂,以下我就來說明,怎樣讀懂diff。一 diff的三種格式 因為歷史原因...

htons函式具體解釋

part 1 htons函式具體解釋 在linux和windows網路程式設計時需要用到htons和htonl函式,用來將主機位元組順序轉換為網路位元組順序。在intel機器下,執行以下程式 int main 得到的結果是4096,初一看感覺很怪。解釋如下,數字16的16進製表示為0x0010,數字...

全域性鉤子具體解釋

dword dwthreadid 0,hwnd hwndcaller null return callnexthookex g hhook,ncode,wparam,lparam g hwndcaller hwndcaller 用了模組定義檔案時,在使用動態鏈結庫的時間就能夠直接用函式名呼叫函式了,...