版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。
<a href="http://blog.csdn.net/yikai2009/article/details/8653842#t0">Select - 系統調用 int select - 功能</a>
<a href="http://blog.csdn.net/yikai2009/article/details/8653842#t1"> 函數</a>
<a href="http://blog.csdn.net/yikai2009/article/details/8653842#t2"> 參數</a>
<a href="http://blog.csdn.net/yikai2009/article/details/8653842#t3"> 傳回值</a>
<a href="http://blog.csdn.net/yikai2009/article/details/8653842#t4">Select - 系統調用- 使用方法</a>
<a href="http://blog.csdn.net/yikai2009/article/details/8653842#t5"> 1将要監控的檔案添加到檔案描述符集</a>
<a href="http://blog.csdn.net/yikai2009/article/details/8653842#t6"> 2調用 Select 開始監控</a>
<a href="http://blog.csdn.net/yikai2009/article/details/8653842#t7"> 3判斷檔案是否發生變化</a>
<a href="http://blog.csdn.net/yikai2009/article/details/8653842#t8">四個宏對描述符集進行操作 - FD_SET - FD_CLR - FD_ZERO - FD_ISSET </a>
<a href="http://blog.csdn.net/yikai2009/article/details/8653842#t9">Poll 方法 - 驅動中 int poll</a>
<a href="http://blog.csdn.net/yikai2009/article/details/8653842#t10">Poll 裝置方法負責完成 - 驅動中 </a>
<a href="http://blog.csdn.net/yikai2009/article/details/8653842#t11">使用 poll_wait 将等待隊列添加到 poll_table 中</a>
<a href="http://blog.csdn.net/yikai2009/article/details/8653842#t12">傳回描述裝置是否 可讀 或者 可寫 的掩碼 - POLLIN</a>
<a href="http://blog.csdn.net/yikai2009/article/details/8653842#t13">Poll 工作原理</a>
在驅動 ( 核心空間 ) Poll 方法 對應的是 Select 系統調用 ( 使用者空間 ).
Poll -------------------------> Select
Seclect 系統調用用于多路監控,當沒有一個檔案滿足要求時,Select将阻塞調用程序.
int select ( int maxfd , fd_set *readfds , fd_set * writefds , fe_set *exceptfds , const stuct timeval * timeout ) .
Maxfd : 檔案描述符的範圍,比待檢測的最大檔案描述符 大 1 .
Readfds :被讀檢測的檔案描述符集.
Writefds :被寫監控的檔案描述符集.
Exceptfds:被異常監控的檔案描述符集.
Timeout :定時器.
Timeout 取不同的值。該調用有不同的表現:
1,Timeout 值為 0,不管是否有檔案滿足要求,都立刻傳回.
無檔案滿足要求傳回 0 ,有檔案滿足要求傳回一個正值.
2,Timeout 為 NULL .Select 将阻塞程序. 直到某個檔案滿足要求.
3,Timeout 為正整數,就是等待的最長時間,即 Select 在 Timeout 時間内阻塞程序.
Select 調用傳回時,傳回值有如下情況:
1,正常情況下傳回滿足要求的檔案描述符個數.
2,經過了 Timeout 等待後仍無檔案滿足要求,傳回值為 0 .
3,如果 Select 被某個信号中斷,它将傳回 -1 并 設定 errno 為 EINTR .
4,如果出錯,傳回 -1 并設定相應的 errno .
系統提供了 4 個宏對描述符集 進行操作:
#include < sys/select.h >
void FD_SET ( int fd , fd_set * fdset ) 将檔案描述符 fd 添加到檔案描述集 fdset 中.
void FD_CLR ( int fd , fd_set * fdset ) 從檔案描述符集 fdset 中清除檔案描述符 fd .
void FD_ZERO ( fd_set * fdset ) 清空檔案描述符集 fdset .
void FD_ISSET ( int fd , fd_set * fdset ) 在調用 Select 後 使用該宏 來檢測檔案描述符集 fdset 中檔案 fd 發生了變化.
eg:
應用程式常常使用 Select 系統調用,它可能會阻塞程序.
這個調用由驅動的 Poll 方法來實作,原型為:
unsigned int ( *poll ) ( struct file * filp , poll_table * wait )
1,使用 poll_wait 将等待隊列添加到 poll_table 中.
2, 傳回描述裝置是否可讀或者可寫的掩碼.
位掩碼:
POLLIN :裝置可讀.
POLLRDNORM : 資料可讀.
POLLOUT :裝置可寫.
POLLWRNORM :資料可寫.
裝置可讀通常傳回 ( POLLIN | POLLRDNORM )
裝置可寫通常傳回 ( POLLOUT | POLLWRNORM )
Poll 方法隻是做一個登記,真正的阻塞發生在 select.c 中的 do_select 函數中.
<b>本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/sky-heaven/p/6985370.html</b><b>,如需轉載請自行聯系原作者</b>