Linux下程序間通訊 命名管道

2021-10-05 05:36:15 字數 2923 閱讀 7508

管道是一種兩個程序間進行單向通訊的機制。因為管道傳遞資料的單向性,管道又稱為半雙工管道。管道的這一特點決定了器使用的侷限性。管道是linux支援的最初unix ipc形式之一,具有以下特點:

1,資料只能由乙個程序流向另乙個程序(其中乙個讀管道,乙個寫管道);如果要進行雙工通訊,需要建 立兩個管道;

2,管道只能用於父子程序或者兄弟程序間通訊。,也就是說管道只能用於具有親緣關係的程序間通訊。

posix標準中的fifo又名有名管道或命名管道。我們知道前面講述的posix標準中管道是沒有名稱的,所以它的最大劣勢是只能用於具有親緣關係的程序間的通訊。fifo最大的特性就是每個fifo都有乙個路徑名與之相關聯,從而允許無親緣關係的任意兩個程序間通過fifo進行通訊。所以,fifo的兩個特性:

1,和管道一樣,fifo僅提供半雙工的資料通訊,即只支援單向的資料流;

2,和管道不同的是,fifo可以支援任意兩個程序間的通訊。

前面講到的未命名的管道只能在兩個具有親緣關係的程序之間通訊,通過命名管道(named pipe)fifo,不相關的程序也能 交換資料。fifo不同於管道之處在於它提供乙個路徑與之關聯,以fifo的檔案形式存在於系統中。它在磁碟上有對應的節點,但 沒有資料塊——換言之,只是擁有乙個名字和相應的訪問許可權,通過mknode()系統呼叫或者mkfifo()函式來建立的。一旦建 立,任何程序都可以通過檔名將其開啟和進行讀寫,而不侷限於父子程序,當然前提是程序對fifo有適當的訪問權。當不再被 程序使用時,fifo在記憶體中釋放,但磁碟節點仍然存在。

);// 管道是一種半雙工的通訊方式,如果要實現兩個程序間的雙向通訊則需要兩個管道,即兩個管道分別作為兩個程序的讀端和寫端 if(

access

(f_file1 , f_ok))if

(access

(f_file2 , f_ok)

)signal

(sigpipe, sig_pipe);if

(0== mode )

// 這裡以唯讀模式開啟命名管道fifo_file1的讀端,預設是阻塞模式;如果命名管道的寫端被不開啟則open()將會一直阻塞,以另外乙個程序必須首先以寫模式開啟該檔案fifo_file1,否則會出現死鎖

printf

("start open '%s' for write...\n"

, f_file2);if

((fdw_fifo=

open

(f_file2, o_wronly)

)<0)

}else

// 這裡以只寫模式開啟命名管道fifo_file1的寫端,預設是阻塞模式;如果命名管道的讀端被不開啟則open()將會一直阻 塞, 因為前乙個程序是先以讀模式開啟該管道檔案的讀端,所以這裡必須先以寫模式開啟該檔案的寫端,否則會出現死鎖

printf

("start open '%s' for read...\n"

, f_file2);if

((fdr_fifo=

open

(f_file2, o_rdonly)

)<0)

}printf

("start chating with another program now, please input message now: \n");

while

(!g_stop )

// 如果是作為輸入的命名管道上有資料到來則從管道上讀入資料並列印到標註輸出上 if(

fd_isset

(fdr_fifo,

&rdset)

)elseif(

0==rv )

// 如果從管道上讀到位元組數為0,說明管道的寫端已關閉

printf

(", buf);}

// 如果標準輸入上有資料到來,則從標準輸入上讀入資料後,將資料寫入到作為輸出的命名管道上給另外乙個程序 if(

fd_isset

(stdin_fileno,

&rdset))}

}直接執行程式

./a.out 0 輸入「hello world」,

./a.out 1 接收到「hello world」,輸入「me too」,再看./a.out 0會看到接收到「me too」

Linux下程序間通訊 命名管道 mkfifo

摘要 程序間通訊的方法有很多,fifo與管道是最古老,也是相對來說更簡單的乙個通訊機制。fifo相對管道有乙個優勢,就是fifo只要求兩個程序是同一主機的,而不要求程序之間存在親緣關係。fifo是存在於檔案系統的檔案,可以使用諸如open read write等函式來操作。本文總結網路和apue關於...

Linux下程序間通訊之命名管道

管道實現通訊的方式簡單易懂,但乙個不足之處就是管道沒有名字,因此,只能用於具有親緣關係的程序間通訊,在命名管道 named pipe或fifo 提出後,該限制得到了克服。fifo不同於管道之處在於它提供乙個路徑名與之關聯,以fifo的檔案形式儲存於檔案系統中。命名管道是乙個裝置 檔案,因此,即使程序...

Linux程序間通訊 命名管道

ipc 命名管道 一 原理 管道的乙個不足之處是沒有名字,因此,只能用於具有親緣關係的程序間通訊,在命名管道 named pip 或fifo 提出後,該限制得到了克服。fifo 不同於管道之處 在於它提供乙個路徑名與之關聯,以fifo的檔案形式儲存於檔案系統中 命名管道是乙個裝置檔案,因此,即使程序...