select(Linux 程式設計)

2021-09-07 13:20:03 字數 2173 閱讀 6749

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程式設計 socket程式設計

什麼是套接字 套接字是一種通訊過程,它使客戶 伺服器系統的開發工作既可以在本地單機上進行,也可以跨網路進行。套接字建立過程 1,建立乙個套接字,這是分配給該伺服器程序的乙個作業系統資源,套接字由伺服器通過系統呼叫socket建立出來的,所以其它程序將不能對它進行訪問。2,給套接字起個名字,用系統呼叫...