linux 有名管道FIFO的一點理解

2021-06-14 19:07:46 字數 973 閱讀 8932

linux有名管道的使用主要涉及到unlink,mkfifo,read,write,close這幾個函式。此處主要討論下關於o_nonblock標誌的影響。函式手冊中說道此標誌決定是否阻塞讀,寫操作。我的初步理解是此標誌會影響read/write的操作。但是,實際情況好像並不是這樣。通過下面的程式和執行結果就可以看到。

#include    

#include

#include

#include

#include

#include

#include

#include

#include

int main() pid = fork(); if(pid > 0) else if(pid == 0) } /unistd>

下面是執行結果:

in the child

in the father

《此處無停頓》

file id is 3please enter msg

《輸入》hello world!<\n>

write ok

《如果從 in the father之後到此處未滿10秒,則停頓到10秒,若超過時間則直接列印下面的內容》

read bytes 13

the text is

hello world!<\n>

但是,如果將原始碼的29行與30行的順序交換。則運**況就非常不一樣了!

執行時,會在上面的執行結果「in the father"之後停頓10秒,然後才會列印file id is 3 和 please enter msg的資訊。

原因是在源程式中未使用o_nonblock選項。由此看出o_nonblock選項不是阻塞的read/write。他的作用是阻塞open。當以只寫方式開啟,且沒有另外的程序以讀的方式開啟時,那麼這個open就會被阻塞。直到有程序以讀操作的方式開啟這個fifo。從執行的表面情況是這樣。不知是否正確!希望大俠們多指點!

linux 有名管道(FIFO)

管道的緩衝區是有限的 管道制存在於記憶體中,在管道建立時,為緩衝區分配乙個頁面大小 管道所傳送的是無格式位元組流,這就要求管道的讀出方和寫入方必須事先約定好資料的格式,比如多少位元組算作乙個訊息 或命令 或記錄 等等 多個寫程序,乙個讀程序。可以參考我之前的部落格 一旦設定了阻塞標誌,呼叫mkfif...

FIFO 有名管道

有名管道相關的關鍵概念 管道應用的乙個重大限制是它沒有名字,因此,只能用於具有親緣關係的程序間通訊,在有名管道 named pipe或fifo 提出後,該限制得到了克服。fifo不同於管道之處在於它提供乙個路徑名與之關聯,以fifo的檔案形式存在於檔案系統中。這樣,即 使與fifo的建立程序不存在親...

管道和FIFO 有名管道 (一)

管道與fifo 管道 由於沒有名字,只能在有共同祖先 有親緣關係 的程序間使用。管道普遍用於shell中,也可以在程式中實現子程序向父程序回傳資訊。fifo 有名管道,可在無親緣關係的程序間使用。以上都使用read write函式訪問。管道由pipe函式建立,提供乙個單向資料流。include in...