天天看點

Linux 裝置驅動--- Poll 方法 --- Select【轉】

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。

<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  -------------------------&gt;   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  &lt; sys/select.h &gt;

                  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:

Linux 裝置驅動--- Poll 方法 --- Select【轉】

         應用程式常常使用 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 )                 

Linux 裝置驅動--- Poll 方法 --- Select【轉】

         Poll 方法隻是做一個登記,真正的阻塞發生在 select.c 中的 do_select 函數中.

<b>本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/sky-heaven/p/6985370.html</b><b>,如需轉載請自行聯系原作者</b>

繼續閱讀