1 #include select.h>2int
select(int maxfdps, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);
maxfdps:被監聽的檔案描述符(fd)的數量;
readset:結構指標型別(readset指向乙個結構體),該結構體僅包含乙個內建的整型陣列,表示可讀事件對應的fd集合,該陣列中的每一位(bit)標記乙個fd。由於fd集合是用內建陣列表示的,所以能夠容納的fd的數量有限,限制了select能夠同時處理的fd的數量;
writeset(可寫事件),exceptset(異常事件)同上;
timeout:結構指標型別,設定select函式的超時時間,該結構體包含兩個long型變數,分別表示表示秒數和微秒數。
1struct
timeval
2;
返回值:給timeout的兩個成員變數均傳遞0,select立即返回;傳遞null,select一直阻塞,直到某個fd就緒或者程式捕獲到乙個訊號時,select才返回。
select成功,返回就緒的fd(含可讀,可寫和異常事件對應的fd)的數量(超時時間內沒有fd就緒,返回0);
select失敗,返回-1。
採用一系列巨集來訪問fd_set中的位:
1 #include select.h>2int fd_zero(int fd, fd_set *fdset); //
清除所有位,置0int fd_clr(int fd, fd_set *fdset);
//清楚某一位fd,置0
3int fd_set(int fd, fd_set *fd_set); //
設定某一位fd,置1
4int fd_isset(int fd, fd_set *fdset); //
測試某一位fd是否被置1
應用程式呼叫select函式時,傳入感興趣的fd(對應的位置1,不感興趣的置0)和超時時間,select呼叫返回時,核心修改fd_set陣列通知應用程式哪些fd已經就緒(對應的位置1,未準備就緒的置0),通過遍歷陣列,來輪詢檢測就緒事件;修改timeval的成員通知應用程式阻塞了多久。
呼叫順序:fd_zero,清空fd集合;fd_set,設定感興趣的fd;select,監視就緒的fd;fd_isset,檢測就緒事件。
select系統呼叫
select 系統呼叫 select系統呼叫是用來監視多個檔案控制代碼的狀態的。程式會停在select這裡等待,直到被監視的檔案控制代碼有某乙個或多個發生了狀態改變,或者到了超時時間。具體的select系統呼叫的引數可以看看man手冊裡面的說明,這裡我們用乙個使用者空間的事例來解釋說明一下這個系統呼...
Linux下select 系統呼叫
一 select 函式功能 select系統呼叫允許程式同時在多個底層檔案表述符上,等待輸入的到達或輸出的完成。二 函式意義 乙個伺服器可以同時在多個開啟的套接字等待請求到來的方法而處理多個客戶。只是具體應用的其中之一 自己的理解,但凡是程式在執行過程中會遇到阻塞 不到條件發生就不往下執行 的情況,...
Linux I O復用 select系統呼叫
linux中i o復用使得程式能夠同時監聽多個檔案描述符,這對提高程式的效能至關重要。linux下實現i o復用的系統呼叫主要有select poll epoll。select系統呼叫 select的主要用途是 在一段時間內,監聽使用者感興趣的檔案描述符上的可讀,可寫和異常事件。1.select原型...