前文:
ipc之管道詳解
ipc之fifo(有名管道)詳解
關於阻塞與非阻塞:
首先,乙個描述符能以兩種方式設定成非阻塞。
(1)呼叫open時可指定o_nonblock標誌。
(2)如果乙個描述符已經開啟,那麼可以呼叫fcntl以啟用o_nonblock標誌。
因為管道沒有open呼叫,在pipe呼叫中沒法指定o_nonblock標誌,所以管道必須使用fcntl函式來設定。
圖4-21給出了非阻塞標誌對於乙個開啟fifo的影響、對乙個空管道或空fifo讀出資料的影響以及對乙個管道或fifo寫入資料的影響。
下面是關於管道或fifo的讀出與寫入的若干額外規則。
(1)如果請求讀出的資料量多於管道或fifo中當前可用資料量,那麼只返回這些可用的資料。
(2)如果請求寫入的資料的位元組數小於或等於pipe_buf(乙個posix限制值,可以通過getconf命令檢視pipe_buf的大小),那麼write操作保證的原子的。這意味著,如果有兩個程序差不多同時往同乙個管道或fifo寫,那麼或者先寫入來自第乙個程序的所有資料,再寫入來自第二個程序的所有資料,或者顛倒過來。系統不會互相混雜來自這兩個程序的資料。然而,如果請求寫入的資料的位元組數大於pipe_buf,那麼write操作不能保證是原子的。
(3)o_nonblock標誌的設定對write操作的原子性沒有影響。原子性完全是由所請求位元組數是否小於等於pipe_buf決定的。然而當乙個管道或fifo設定成非阻塞時,來自write的返回值取決於待寫的位元組數以及該管道或fifo中當前可用空間的大小。
寫入的位元組數小於等於pipe_buf:
a.如果該管道或fifo中有足以存放所請求位元組數的空間,那麼所有資料位元組都寫入。
b.如果該管道或fifo中沒有足以存放所請求位元組數的空間,那麼立即返回乙個eagain錯誤。
寫入的位元組數大於
pipe_buf:
a.如果該管道或fifo中至少有1位元組空間,那麼核心寫入該管道或fifo能容納數目的資料位元組,該數目同時作為來自write的返回值。
b.如果該管道或fifo已滿,那麼立即返回乙個eagain錯誤。
(4)如果向乙個沒有為讀開啟著的管道或fifo寫入,那麼核心將產生乙個sigpipe訊號;
a.如果呼叫程序既沒有捕獲也沒有忽略該sigpipe訊號,所採取的預設行為就是終止該程序。
b.如果呼叫程序忽略了該sigpipe訊號,或者捕獲了該訊號並從其訊號處理程式中返回,那麼write返回乙個epipe錯誤。
參考:《unix網路程式設計》·卷2
end;
IPC之FIFO 有名管道 詳解
基本概念 管道沒有名字,因此它們的最大劣勢是只能用於有乙個共同祖先程序的各個程序之間。我們無法在無親緣關係的程序間建立乙個管道並將它用作ipc管道 不考慮描述符傳遞 fifo指先進先出 first in,first out 它是乙個單向 半雙工 資料流。不同於管道的是,每個fifo有乙個路徑名與之關...
IPC實現機制(二) 命名管道(FIFO)
一 fifo的概念 匿名管道 pipe 的 個不 之處是沒有名字,因此,只能 於具有親緣關係的程序間通訊 因此,提出了命名管道 命名管道 fifo 提供 個路徑名與之關聯,以fifo的 件形式儲存於 件系統中。命名管道是 個裝置 件,因此,即使程序與建立fifo的程序不存在親緣關係,只要可以訪問該路...
Linux 多程序 IPC之有名管道FIFO
命名管道也被稱為fifo檔案,是一種特殊的檔案。由於linux所有的事物都可以被視為檔案,所以對命名管道的使用也就變得與檔案操作非常統一。1 建立命名管道 用如下兩個函式中的其中乙個,可以建立命名管道。include include int mkfifo const char filename,mo...