poll函數(shù) 在上文unix下網(wǎng)絡編程之I/O復用(二)中已經(jīng)介紹了select函數(shù)的相關使用,本文將介紹另一個常用的I/O復用函數(shù)poll。poll提供的功能與select類似,不過在處理流設備時,它能夠提供額外的信息。 poll函數(shù)原型:
第一個參數(shù)是指向一個結構數(shù)組第一個元素的指針,每個數(shù)組元素都是一個pollfd結構。如下:
要測試的條件由events成員指定,函數(shù)在相應的revents成語中返回該描述字的狀態(tài)。(每個描述字都有兩個變量,一個為調用值,另一個為返回結果,從而避免使用值-結果參數(shù),這與select函數(shù)是不同的)。下圖列出了用于指定events標志以及測試revents標志的一些常值。 上圖需要注意的是,POLLERR,POLLHUP,POLLNVAL是處理錯誤的描述字,因此它們也就不可以出現(xiàn)在input事件中,即events。poll識別三類數(shù)據(jù):普通(normal),優(yōu)先級帶(priority band)和高優(yōu)先級(high priority)。 對TCP和UPD而言,以下條件引起poll返回特定的revents。 1、 All regular TCP data and all UDP data is considered normal. ——《unix網(wǎng)絡編程》第三版 參數(shù)nfds,指示結構數(shù)組中元素的個數(shù)。 參數(shù)timeout: 與select中的timeout不同,poll函數(shù)的timeout參數(shù)是一int值,表示poll函數(shù)返回前等待多長時間,它是毫秒級別的。它有三種情況的取值:1、INFTIM(一個負數(shù)值),表示永遠等待,即一直阻塞。2、0,表示立即返回,非阻塞。3、>0,表示正待指定數(shù)目的毫秒數(shù)。 poll函數(shù)的返回值: 當poll發(fā)生錯誤時,poll函數(shù)的返回值-1,若定時器時間到之前沒有任何描述字就緒,則返回0,否則返回就緒描述字的個數(shù),即其revents成員值非0的描述字個數(shù)。 如果我們不再關心某個特定描述字,那么可以把與他對應的pollfd結構的fd成員設置成一個負值。poll函數(shù)將忽略這樣的pollfd結構的events成員,返回時將它的revents成員的值置為0。
poll函數(shù)的通信列子:一個簡單的TCP回射服務器程序 pollServer.c:使用select機制的服務器程序
客戶端程序參考上一篇文章。 總結: 本文介紹了poll函數(shù)的原型,參數(shù)說明,注意事項以及一個簡單的代碼例子。在unix后續(xù)版本中,加入了epoll函數(shù)I/O復用機制,它在一定條件下更加高效,在以后的文章中,會對epoll機制再進行詳細的描述。之前在學習python的時候,也接觸了select和poll,但是當時了解的比較淺顯,希望通過最近的學習可以對unix下I/O復用有更深入的認識。 |
|
來自: 看風景D人 > 《網(wǎng)絡編程》