Linux 程序間通訊 1 管道

2021-09-20 10:07:49 字數 2171 閱讀 7068

1. 匿名管道

#include 功能:建立匿名管道

int pipe(int fd[2]);

引數fd:檔案描述符陣列,其中fd[0]表示讀端, fd[1]表示寫端

返回值:成功返回0,失敗返回-1

管道並非屬於程序的資源, 屬於作業系統, 父子程序共享用於管道的檔案描述符, 所以兩個程序通過作業系統提供的記憶體空間進行通訊

管道特點

1. 能用於具有共同祖先的程序(具有親緣關係的程序)之間進行通訊;通常,乙個管道由乙個程序創

建,然後該程序呼叫fork,此後父、子程序之間就可應用該管道

2. 管道是半雙工的,資料只能向乙個方向流動;需要雙方通訊時,需要建立起兩個管道

管道讀寫特點

當沒有資料可讀時: read呼叫阻塞,即程序暫停執行,一直等到有資料來到為止

當管道滿的時候:     write呼叫阻塞,直到有程序讀走資料

** (子程序讀, 父程序寫):  

int main() else if (ret == 0) else 

return 0;

}

管道應用的乙個限制就是只能在具有共同祖先(具有親緣關係)的程序間通訊, 如果我們想在不相關的程序之間交換資料,可以使用fifo檔案來做這項工作,它經常被稱為命名管道  命名管道是一種特殊型別的檔案

2.命名管道

命名管道建立

1. 可以直接在命令列建立

$ mkfifo filename

2. 從程式裡建立

int mkfifo(const char *filename,mode_t mode);

成功返回 0 失敗返回 -1

filename: 檔名

mode: 檔案許可權 0664

匿名管道和命名管道的區別

匿名管道由pipe函式建立並開啟

命名管道由mkfifo函式建立,開啟用open

fifo(命名管道)與pipe(匿名管道)之間唯一的區別在它們建立與開啟的方式不同,一但這些工作完

成之後,它們具有相同的語義

命名管道的 open 規則

如果當前開啟操作是為讀而開啟fifo時: 阻塞直到有相應程序為寫而開啟該fifo

如果當前開啟操作是為寫而開啟fifo時: 阻塞直到有相應程序為讀而開啟該fifo

命名管道的讀寫規則

和匿名管道相同

沒有資料時 read 命名管道會阻塞等待寫入

管道裝滿時 write 會等待讀取

使用命名管道複製檔案: 建立命名管道 ---->  乙個程式讀檔案寫入管道  ----> 乙個程式讀管道寫入檔案副本

**:

建立管道, 讀取檔案, 寫入管道:

int main()

//2. 以唯讀的方式開啟要複製的檔案

int fd = open("./test", o_rdonly);

//3. 以寫的方式開啟命名管道

int wfifo = open("./tp", o_wronly);

//4. 讀取檔案內容並寫入管道

int len = 0;

char buf[1024];

while( (len = read(fd, buf, 1024)) > 0)

close(fd);

close(wfifo);

return 0;

}

讀取管道, 寫入檔案: 

int main()

close(fd);

close(rfifo);

unlink("./tp");

return 0;

}

Linux程序間通訊 1 管道

linux程序間通訊 1 同主機程序間資料互動機制 無名管道 pipe 有名管道 fifo 訊息佇列 message queue 和共享記憶體 share memory 2 同主機程序間同步機制 訊號量 semaphore 3 同主機程序間非同步機制 訊號 signal 4 網路主機間資料互動機制 ...

程序間通訊(1) 管道

linux下一切皆檔案,我們可以建立乙個管道檔案進行通訊,實際上是呼叫pipe函式在核心中開闢一塊緩衝區 稱為管道 用於通訊,管道是一種最基本的ipc機制,由pipe函式建立 include int pipe int filedes 2 它有乙個讀端乙個寫端,然後通過filedes引數傳出給使用者程...

匿名管道(程序間通訊1)

前提 原來也寫過匿名管道的 但是總覺得沒有了解過底層,只是知道 管道是乙個檔案它存在與記憶體上,一般父子程序之間使用但是並沒有研究過底層。所以這次參考linux核心情景分析這本書進行整理。因為對linux虛擬檔案系統的了解因此這次對於匿名管道也有多幫助畢竟他也是個檔案哈哈哈哈哈開始吧 它的系統呼叫是...