讀書筆記:LLD3(2)非堵塞型I/O

非堵塞型I/O:當(dāng)數(shù)據(jù)不可用時,進(jìn)程調(diào)用read或write系統(tǒng)調(diào)用時,進(jìn)程不會堵塞,會立即返回,即使現(xiàn)在沒有數(shù)據(jù)可讀或者可寫。

非堵塞型I/O分為 兩種:顯示和隱式的。

顯示:即將filp->f_flags中的O_NONBLOCK置位。

隱式:在調(diào)用read或write系統(tǒng)調(diào)用之前,先調(diào)用poll select或者epoll 查詢該文件是否有數(shù)據(jù)可讀寫。

注釋:O_NONBLOCK只對read write 和open有效。

? ? ? ? ? ?poll select和epoll在調(diào)用過程中會堵塞。

poll 和 select(輪詢):

用來查詢某個或者多個文件描述符上的讀取或?qū)懭胧欠駮欢氯H绻F(xiàn)在沒有可以讀寫的文件描述符,則堵塞等待直到有可讀寫的文件描述符。如果有,則直接返回可以讀寫的文件描述符。

poll的實現(xiàn)(<linux/poll.h>):

方法原型:unsigned int (*poll) (struct file ? *filp, poll_table *wait);

該函數(shù)分為兩步執(zhí)行:

在一個或多個可指示poll狀態(tài)變化的等待隊列上調(diào)用poll_wait。如果當(dāng)前沒有文件描述符可用來執(zhí)行I/O,則內(nèi)核將使進(jìn)程在傳遞到該系統(tǒng)調(diào)用的所有文件描述符對應(yīng)的等待隊列上等待。

返回一個用來描述操作是否可以立即執(zhí)行的位掩碼。

poll_wait:

void poll_wait(struct file *,wait_queue_head_t *, poll_table *)

位掩碼:

POLLIN:如果設(shè)備可以無堵塞地讀取,就設(shè)置該位

POLLRDNORM:如果“通常”的數(shù)據(jù)已經(jīng)就緒,可以讀取,就設(shè)置該位。一個可讀設(shè)備返回(POLLIN | POLLRDNORM)

POLLOUT:如果設(shè)備可以無堵塞地寫入,就設(shè)置該位

POLLWRNORM:如果“通?!钡臄?shù)據(jù)已經(jīng)就緒,可以寫入,就設(shè)置該位。一個可讀設(shè)備返回(POLLOUT?| POLLWRNORM)

實例代碼(lld3 ?scull/pipe.c):

down(&dev->sem);

poll_wait(filp, &dev->inq, ?wait);

poll_wait(filp, &dev->outq,wait);

if (dev->rp != dev->wp)

? ? ? ? ? ? mask | = POLLIN | POLLRDNORM;

if (spacefree(dev))

? ? ? ? ? ? ?mask | = POLLOUT | POLLWRNORM;

up(&dev->sem);

return mask;


2016.04.14

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 名稱 libev - 一個 C 編寫的功能全面的高性能事件循環(huán)。 概要 示例程序 關(guān)于 libev Libev 是...
    hanpfei閱讀 15,542評論 0 5
  • 看到網(wǎng)上有不少討論epoll,但大多不夠詳細(xì)準(zhǔn)確,以前面試有被問到這個問題。不去更深入的了解,只能停留在知其然...
    電臺_Fang閱讀 12,151評論 0 8
  • make menuconfig過程解析作者 codercjg 在 28 九月 2015, 5:27 下午 make...
    codercjg閱讀 1,235評論 0 1
  • 一、概述 I/O復(fù)用使得程序能同時監(jiān)聽多個文件描述符,這對提高程序的性能至關(guān)重要。 I/O復(fù)用雖然能同時監(jiān)聽多個文...
    saviochen閱讀 1,267評論 0 4
  • 小小的孩子 流著長長的鼻涕 春天里的小河邊 小孩子呀 沾著泥巴的手里 是死去的蝌蚪 夏天里的小河邊 一張一張的網(wǎng) ...
    馬一月閱讀 187評論 0 0

友情鏈接更多精彩內(nèi)容