成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

學習手冊:Linux操作系統下的poll和select

運維 系統運維
計算機的發展,Linux操作系統越來越成為主流,你了解Linux操作系統系統么?本文為你詳細介紹Linux操作系統下的poll和select ,為你在學習Linux操作系統下的poll和select時起一定的作用。

計算機的發展,Linux操作系統越來越成為主流,你了解Linux操作系統系統么?你是Linux操作系統系統的應用者么?本文為你詳細介紹Linux操作系統下的poll和select ,為你在學習Linux操作系統下的poll和select 時起一定的作用。    

select()函數的作用
系統調用select和poll的后端實現,用這兩個系統調用來查詢設備是否可讀寫,或是否處于某種狀態。如果poll為空,則驅動設備會被認為即可讀又可寫,返回值是一個狀態掩碼
如何使用select()函數?
select()函數的接口主要是建立在一種叫'fd_set'類型的基礎上。它('fd_set') 是一組文件描述符(fd)的集合。由于fd_set類型的長度在不同平臺上不同,因此應該用一組標準的宏定義來處理此類變量:

  1. fd_set set;  
  2. FD_ZERO(&set);   /* 將set清零 */  
  3. FD_SET(fd, &set);/* 將fd加入set */  
  4. FD_CLR(fd, &set);/* 將fd從set中清除 */  
  5. FD_ISSET(fd, &set);   /* 如果fd在set中則真 */ 

在過去,一個fd_set通常只能包含少于等于32個文件描述符,因為fd_set其實只用了一個int的比特矢量來實現,在大多數情況下,檢查 fd_set能包括任意值的文件描述符是系統的責任,但確定你的fd_set到底能放多少有時你應該檢查/修改宏FD_SETSIZE的值。*這個值是系統相關的*,同時檢查你的系統中的select() 的man手冊。有一些系統對多于1024個文件描述符的支持有問題。[譯者注: Linux操作系統就是這樣的系統!你會發現sizeof(fd_set)的結果是128(*8 = FD_SETSIZE=1024) 盡管很少你會遇到這種情況。]

select的基本接口十分簡單:

  1. int select(int nfds, fd_set *readset, fd_set *writeset,  
  2. fd_set *exceptset, struct timeval *timeout); 

其中:

nfds
 需要檢查的文件描述符個數,數值應該比是三組fd_set中***數
 更大,而不是實際文件描述符的總數。
readset   
 用來檢查可讀性的一組文件描述符。
writeset
 用來檢查可寫性的一組文件描述符。
exceptset
 用來檢查意外狀態的文件描述符。(注:錯誤并不是意外狀態)
timeout
 NULL指針代表無限等待,否則是指向timeval結構的指針,代表最
 長等待時間。(如果其中tv_sec和tv_usec都等于0, 則文件描述符
 的狀態不被影響,但函數并不掛起)
 
函數將返回響應操作的對應操作文件描述符的總數,且三組數據均在恰當位置被修改,只有響應操作的那一些沒有修改。接著應該用FD_ISSET宏來查找返回的文件描述符組。

這里是一個簡單的測試單個文件描述符可讀性的例子:

  1.  int isready(int fd)  
  2.  {  
  3. int rc;  
  4. fd_set fds;  
  5. struct timeval tv;  
  6.       
  7. FD_ZERO(&fds);  
  8. FD_SET(fd,&fds);  
  9.     // tvtv.tv_sec = tv.tv_usec = 0;  
  10.       
  11. //rc = select(fd+1, &fds, NULL, NULL, &tv);  
  12.    rc = select(fd+1, &fds, NULL, NULL, NULL);  
  13. if (rc < 0)  
  14.   return -1;  
  15.       
  16. return FD_ISSET(fd,&fds) ? 1 : 0;  
  17.  }  

當然如果我們把NULL指針作為fd_set傳入的話,這就表示我們對這種操作的發生不感興趣,但select() 還是會等待直到其發生或者超過等待時間。

[譯者注:在Linux操作系統中,timeout指的是程序在非sleep狀態中度過的時間,而不是實際上過去的時間,這就會引起和非Linux操作系統平臺移植上的時間不等問題。移植問題還包括在System V風格中select()在函數退出前會把timeout設為未定義的 NULL狀態,而在BSD中則不是這樣, Linux操作系統在這點上遵從System V,因此在重復利用timeout指針問題上也應該注意。]

Linux操作系統下select調用的過程:
1.用戶層應用程序調用select(),底層調用poll())
2.核心層調用sys_select() ------> do_select()
最終調用文件描述符fd對應的struct file類型變量的struct file_operations *f_op的poll函數。
poll指向的函數返回當前可否讀寫的信息。
1)如果當前可讀寫,返回讀寫信息。
2)如果當前不可讀寫,則阻塞進程,并等待驅動程序喚醒,重新調用poll函數,或超時返回。
3.驅動需要實現poll函數。
當驅動發現有數據可以讀寫時,通知核心層,核心層重新調用poll指向的函數查詢信息。
poll_wait(filp,&wait_q,wait)    // 此處將當前進程加入到等待隊列中,但并不阻塞
在中斷中使用wake_up_interruptible(&wait_q)喚醒等待隊列

希望本文對你學習Linux操作系統下的poll和select有所幫助。

【編輯推薦】

  1. 詳解Linux操作系統中使用Windows分區
  2. 完成Linux漢化輕松應用Linux
  3. Linux技術受風河與NEC垂青
  4. 多樣性的Linux桌面
  5. Red Hat宣布企業Linux 6將不再支持安騰
責任編輯:小霞 來源: NET130
相關推薦

2009-12-16 09:43:12

Linux操作系統

2011-01-05 10:32:31

linuxqq

2009-12-23 16:29:01

Linux操作系統

2010-04-29 14:08:38

Unix操作系統

2009-12-02 14:50:28

操作系統

2011-01-04 14:36:39

LinuxGTK編程

2009-12-17 14:11:29

Linux操作系統

2009-06-21 13:50:03

Linux隱藏文件

2009-12-09 17:25:19

Linux操作系統

2009-04-07 15:45:54

2010-03-04 14:44:18

2009-09-18 13:17:05

2010-01-06 16:32:45

Linux操作系統

2013-05-22 14:59:26

Linux操作系統實時性

2012-05-29 09:42:08

Linux服務器窗口管理

2011-01-10 16:34:13

linux安裝

2009-12-22 13:44:33

Linux操作系統

2009-06-25 08:53:03

Linux操作系統

2010-01-05 16:14:23

Linux操作系統

2020-12-29 16:39:01

Linux代碼命令
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产色99| 国产午夜精品一区二区三区嫩草 | 青青久久av北条麻妃海外网 | 欧美精品一区在线 | 综合色播 | 污视频在线免费观看 | 欧美综合在线观看 | 免费成人高清在线视频 | 亚洲福利av | 国产在线一区二区三区 | 91 在线 | 99视频入口 | 国产在线一区二区三区 | 国产精品久久久爽爽爽麻豆色哟哟 | 天天操天天射综合 | 国产精品一区二区欧美 | 人人爱干 | 久久机热 | 成人h视频在线 | 亚洲欧美一区二区三区国产精品 | 日韩欧美在线免费观看视频 | 91社区在线观看 | 美女福利视频网站 | 九九九视频在线观看 | 亚洲综合在线视频 | 视频一区二区在线观看 | 91.xxx.高清在线 | 国产中文字幕在线 | 国产欧美一区二区三区另类精品 | 99热首页| 91精品国产综合久久久久久漫画 | 国产精品一区二 | 国产高清视频在线观看 | 欧美视频网 | 欧美性网 | 精品一区二区三区在线观看国产 | 日韩中文字幕在线播放 | 99精品国产一区二区三区 | 欧美激情精品久久久久久 | 欧美在线a | 亚洲一区二区中文字幕 |