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 用了模組定義檔案時,在使用動態鏈結庫的時間就能夠直接用函式名呼叫函式了,...