自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

學(xué)習(xí)手冊(cè):Linux操作系統(tǒng)下的poll和select

運(yùn)維 系統(tǒng)運(yùn)維
計(jì)算機(jī)的發(fā)展,Linux操作系統(tǒng)越來(lái)越成為主流,你了解Linux操作系統(tǒng)系統(tǒng)么?本文為你詳細(xì)介紹Linux操作系統(tǒng)下的poll和select ,為你在學(xué)習(xí)Linux操作系統(tǒng)下的poll和select時(shí)起一定的作用。

計(jì)算機(jī)的發(fā)展,Linux操作系統(tǒng)越來(lái)越成為主流,你了解Linux操作系統(tǒng)系統(tǒng)么?你是Linux操作系統(tǒng)系統(tǒng)的應(yīng)用者么?本文為你詳細(xì)介紹Linux操作系統(tǒng)下的poll和select ,為你在學(xué)習(xí)Linux操作系統(tǒng)下的poll和select 時(shí)起一定的作用。    

select()函數(shù)的作用
系統(tǒng)調(diào)用select和poll的后端實(shí)現(xiàn),用這兩個(gè)系統(tǒng)調(diào)用來(lái)查詢(xún)?cè)O(shè)備是否可讀寫(xiě),或是否處于某種狀態(tài)。如果poll為空,則驅(qū)動(dòng)設(shè)備會(huì)被認(rèn)為即可讀又可寫(xiě),返回值是一個(gè)狀態(tài)掩碼
如何使用select()函數(shù)?
select()函數(shù)的接口主要是建立在一種叫'fd_set'類(lèi)型的基礎(chǔ)上。它('fd_set') 是一組文件描述符(fd)的集合。由于fd_set類(lèi)型的長(zhǎng)度在不同平臺(tái)上不同,因此應(yīng)該用一組標(biāo)準(zhǔn)的宏定義來(lái)處理此類(lèi)變量:

  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中則真 */ 

在過(guò)去,一個(gè)fd_set通常只能包含少于等于32個(gè)文件描述符,因?yàn)閒d_set其實(shí)只用了一個(gè)int的比特矢量來(lái)實(shí)現(xiàn),在大多數(shù)情況下,檢查 fd_set能包括任意值的文件描述符是系統(tǒng)的責(zé)任,但確定你的fd_set到底能放多少有時(shí)你應(yīng)該檢查/修改宏FD_SETSIZE的值。*這個(gè)值是系統(tǒng)相關(guān)的*,同時(shí)檢查你的系統(tǒng)中的select() 的man手冊(cè)。有一些系統(tǒng)對(duì)多于1024個(gè)文件描述符的支持有問(wèn)題。[譯者注: Linux操作系統(tǒng)就是這樣的系統(tǒng)!你會(huì)發(fā)現(xiàn)sizeof(fd_set)的結(jié)果是128(*8 = FD_SETSIZE=1024) 盡管很少你會(huì)遇到這種情況。]

select的基本接口十分簡(jiǎn)單:

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

其中:

nfds
 需要檢查的文件描述符個(gè)數(shù),數(shù)值應(yīng)該比是三組fd_set中***數(shù)
 更大,而不是實(shí)際文件描述符的總數(shù)。
readset   
 用來(lái)檢查可讀性的一組文件描述符。
writeset
 用來(lái)檢查可寫(xiě)性的一組文件描述符。
exceptset
 用來(lái)檢查意外狀態(tài)的文件描述符。(注:錯(cuò)誤并不是意外狀態(tài))
timeout
 NULL指針代表無(wú)限等待,否則是指向timeval結(jié)構(gòu)的指針,代表最
 長(zhǎng)等待時(shí)間。(如果其中tv_sec和tv_usec都等于0, 則文件描述符
 的狀態(tài)不被影響,但函數(shù)并不掛起)
 
函數(shù)將返回響應(yīng)操作的對(duì)應(yīng)操作文件描述符的總數(shù),且三組數(shù)據(jù)均在恰當(dāng)位置被修改,只有響應(yīng)操作的那一些沒(méi)有修改。接著應(yīng)該用FD_ISSET宏來(lái)查找返回的文件描述符組。

這里是一個(gè)簡(jiǎn)單的測(cè)試單個(gè)文件描述符可讀性的例子:

  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.  }  

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

[譯者注:在Linux操作系統(tǒng)中,timeout指的是程序在非sleep狀態(tài)中度過(guò)的時(shí)間,而不是實(shí)際上過(guò)去的時(shí)間,這就會(huì)引起和非Linux操作系統(tǒng)平臺(tái)移植上的時(shí)間不等問(wèn)題。移植問(wèn)題還包括在System V風(fēng)格中select()在函數(shù)退出前會(huì)把timeout設(shè)為未定義的 NULL狀態(tài),而在BSD中則不是這樣, Linux操作系統(tǒng)在這點(diǎn)上遵從System V,因此在重復(fù)利用timeout指針問(wèn)題上也應(yīng)該注意。]

Linux操作系統(tǒng)下select調(diào)用的過(guò)程:
1.用戶(hù)層應(yīng)用程序調(diào)用select(),底層調(diào)用poll())
2.核心層調(diào)用sys_select() ------> do_select()
最終調(diào)用文件描述符fd對(duì)應(yīng)的struct file類(lèi)型變量的struct file_operations *f_op的poll函數(shù)。
poll指向的函數(shù)返回當(dāng)前可否讀寫(xiě)的信息。
1)如果當(dāng)前可讀寫(xiě),返回讀寫(xiě)信息。
2)如果當(dāng)前不可讀寫(xiě),則阻塞進(jìn)程,并等待驅(qū)動(dòng)程序喚醒,重新調(diào)用poll函數(shù),或超時(shí)返回。
3.驅(qū)動(dòng)需要實(shí)現(xiàn)poll函數(shù)。
當(dāng)驅(qū)動(dòng)發(fā)現(xiàn)有數(shù)據(jù)可以讀寫(xiě)時(shí),通知核心層,核心層重新調(diào)用poll指向的函數(shù)查詢(xún)信息。
poll_wait(filp,&wait_q,wait)    // 此處將當(dāng)前進(jìn)程加入到等待隊(duì)列中,但并不阻塞
在中斷中使用wake_up_interruptible(&wait_q)喚醒等待隊(duì)列

希望本文對(duì)你學(xué)習(xí)Linux操作系統(tǒng)下的poll和select有所幫助。

【編輯推薦】

  1. 詳解Linux操作系統(tǒng)中使用Windows分區(qū)
  2. 完成Linux漢化輕松應(yīng)用Linux
  3. Linux技術(shù)受風(fēng)河與NEC垂青
  4. 多樣性的Linux桌面
  5. Red Hat宣布企業(yè)Linux 6將不再支持安騰
責(zé)任編輯:小霞 來(lái)源: NET130
相關(guān)推薦

2009-12-16 09:43:12

Linux操作系統(tǒng)

2011-01-05 10:32:31

linuxqq

2009-12-23 16:29:01

Linux操作系統(tǒng)

2010-04-29 14:08:38

Unix操作系統(tǒng)

2009-12-02 14:50:28

操作系統(tǒng)

2009-06-21 13:50:03

Linux隱藏文件

2011-01-04 14:36:39

LinuxGTK編程

2009-12-17 14:11:29

Linux操作系統(tǒng)

2009-12-09 17:25:19

Linux操作系統(tǒng)

2009-09-18 13:17:05

2010-01-06 16:32:45

Linux操作系統(tǒng)

2013-05-22 14:59:26

Linux操作系統(tǒng)實(shí)時(shí)性

2009-04-07 15:45:54

2010-03-04 14:44:18

2012-05-29 09:42:08

Linux服務(wù)器窗口管理

2009-12-22 13:44:33

Linux操作系統(tǒng)

2009-06-25 08:53:03

Linux操作系統(tǒng)

2011-01-10 16:34:13

linux安裝

2010-01-05 16:14:23

Linux操作系統(tǒng)

2014-07-24 16:29:07

linux學(xué)習(xí)網(wǎng)站
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)