Linux程序間通訊之管道

2022-01-12 01:47:16 字數 2211 閱讀 8895

1,程序間通訊 (ipc ) inter-process communication

比較好理解概念的就是程序間通訊就是在不同程序之間傳播或交換資訊。

2,linux下ipc機制的分類:管道、訊號、共享記憶體、訊息佇列、訊號量、套接字

3,這篇主要說說管道:本質是檔案,其他理論什麼的網上已經有一大堆了,我就只寫一點用法吧。

3.1 特點

1)管道是最古老的ipc,但目前很少使用

2)以檔案做互動的媒介,管道分為有名管道和無名管道

3)歷史上的管道通常是指半雙工管道

3.2 管道:有兩種形式,命令列和非命令列

(1)命令列:

(2)非命令列:這裡又分有名管道無名管道

程式設計模型:程序a建立管道(mkfifo) -> 程序a寫開啟管道(open) -> 程序b讀開啟管道(open) -> 程序a開始往管道裡寫資料(write) ->

程序b從管道中讀資料(read) -> 程序a關閉管道(close) -> 程序b關閉管道(close) -> 刪除管道(unlink)

有名管道(例項):

程序a:

#include#include

#include

#define pipename "pipetest"

intmain()

//寫開啟管道

int fd =open(pipename, o_wronly);

if(-1 ==fd)

unlink(pipename);

int i = 0

;

for(i = 0; i < 10; i++)

//關閉管道

close(fd);

return0;

}

程序b:

#include#include

#include

#define pipename "pipetest"

intmain()

int num = 0

;

int i = 0

;

for(i = 0; i < 10; i++)

printf("\n

");close(fd);

return0;

}

執行效果如下:

開另外乙個終端,執行讀程序

無名管道:適用於父子程序之間的通訊

int pipe(int pipefd[2]):該函式在核心中建立管道檔案,通過輸出引數pipefd返回兩個檔案描述符,其中pipefd[0]用於讀pipefd[1]用於寫

注意:

寫資料的程序關閉讀端pipefd[0]

讀資料的程序關閉寫端pipefd[1]

例項:

#include#include

#include

#include

intmain()

close(fd[

1]);//

關閉寫端

exit(0

); }

//子程序讀管道

close(fd[1]); //

先關閉寫端

intx;

int i = 0

;

for(; i<10; i++)

close(fd[

0]);

printf("\n

");return0;

}

執行效果如下:

linux程序間通訊之管道通訊

一 命名管道通訊 管道通訊分為 無名管道和有名管道 無名管道是用於父子孫程序,之間有血緣關係 有名管道 用於任意兩個程序 無名管道 1 建立 int pipe int filedis 2 它會建立兩個檔案描述符 filedis 0 用於讀管道 filedis 1 用於寫管道 通常先建立乙個管道,再通...

linux程序間通訊之管道

下面幾節,將分別溫習下linux程序進通訊的幾種機制1 管道 管道是比較古老的程序間的通訊方式。主要有有名管道和無名管道兩種。2 無名管道 它的特點就是 1 只能使用在具有親緣關係的程序之間的通訊 父子程序或者兄弟程序之間 因為只有具有親緣關係的程序才能繼承其建立的檔案描述符。2 是乙個半雙工的通訊...

Linux程序間通訊之管道

管道,你可以把它想成一根資料線,連線了兩個程序,使他們可以互相通訊。更嚴謹來說,它是乙個檔案或者一塊共享區,乙個程序往裡面寫資料,另乙個程序從裡面拿資料,以此種方式完成程序間通訊。管道是unix系統ipc最古老的形式,所有的unix系統都提供此種通訊機制 unix系統ipc是各種程序通訊方式的統稱 ...