linux程序間通訊之管道

2021-07-16 15:47:34 字數 2925 閱讀 1063

下面幾節,將分別溫習下linux程序進通訊的幾種機制
1:管道

管道是比較古老的程序間的通訊方式。主要有有名管道和無名管道兩種。
2:無名管道

它的特點就是:

1:只能使用在具有親緣關係的程序之間的通訊(父子程序或者兄弟程序之間)。因為只有具有親緣關係的程序才能繼承其建立的檔案描述符。

2:是乙個半雙工的通訊模式,具有固定的讀端和寫段。

3:可以將管道看著特殊的檔案,也可以呼叫read()和write()操作。

管道是基於檔案描述符的通訊方式,當乙個管道建立時,它會建立兩個檔案描述符fd[0]和fd[1],其中fd[0]是固定用於讀管道, 而fd[1]是固定用於寫管道,構成乙個半雙工通道。

當乙個管道共享多對檔案描述符時,若將其中的一對讀寫檔案描述符都刪除,則該管道將失效。

上面插圖來自《linux應用程式開發標準教程》中,從圖中可以看到當fork()後 , 子程序會繼承父程序建立的管道,這樣父子程序都擁有了自己的讀寫通道, 從而實現了父子之間的讀寫,只需要把無關的讀端或寫段的檔案描述符關閉即可。

例如上圖中,父程序負責讀段,則把它的寫段fd[1]關閉, 子程序負責寫,則把它的讀段fd[0]關掉。這樣就建立起來一條「子程序寫父程序讀」的通道。

下面來看一下無名管道的例項,直接上**:

#include 

#include

#include

#include

#include

#define max_data_len 128

#define delay_time 1

int main()

; const char data ="pipe test program";

int real_read, real_write;

if( pipe(pipe_fd) < 0)

if((pid = fork()) == 0)

close(pipe_fd[0]);

exit(0);

} else

if (pid > 0)

close(pipe_fd[0]);

exit(0);

} else

if (pid > 0)

close(pipe_fd[1]);

waitpid(pid, null, 0);

exit(0);

}

return

0;}

執行結果:

write to pipe is: pipe test program

read data from pipe is pipe test program

3:有名管道

有名管道突破了無名管道的限制,可以使兩個不相關的程序實現彼此之間的通訊。相當於建立乙個檔案,建立管道之後,兩個程序可以把它當做普通檔案一樣進行讀寫操作。嚴格遵循先進先出規則,對管道及fifo的讀寫總是從開始出返回資料,對它們的寫則把資料新增到末尾,需要指出的是不支援lseek()等檔案定位操作。

可以採用mkdfifo()函式來建立乙個命名管道,建立成功後就可以使用open, read, write函式進行操作。

mkfifo函式原型:

int mkfifo(const char *filename, mode_t mode)

傳參: filename為要建立的管道,包括路徑名

mode只建立的管道許可權,一般有o_rdonly(讀管道), o_wronly(寫管道),o_rdwr(讀寫管道),o_nonblock:非堵塞管道。 o_creat(如果檔案不存在,則新建檔案),o_excl:可以測試檔案是否存在。

下面來看乙個有名管道的例子,為了方便看**,直接將命名管道應用在父子程序間通訊:

這#include 

#include

#include

#include

#include

#include

#include

#define myfifo "myfifo"

#define max_data_len 128

#define delay_time 1

int main()

; const

char data ="pipe test program";

int real_read, real_write;

int fd = 0;

// memset((void *)buf, 0, sizeof(buf));

if(access(myfifo, f_ok) == -1)

}if((pid = fork()) == 0)

if(write(fd, data, strlen(data)) > 0)

close(fd);

exit(0);

} else

if (pid > 0)

if(read(fd, buf, max_data_len) > 0)

close(fd);

exit(0);

}return

0;}

執行結果:

write pipe test program to fifo

read pipe test program from fifo

下一節將溫習訊號的使用

linux程序間通訊之管道通訊

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

Linux程序間通訊之管道

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

Linux 程序間通訊之管道

這裡說的管道是指匿名管道 無名管道 是 unix 系統ipc最古老的形式。其本質是乙個偽檔案 實為核心緩衝區 它是半雙工的 即資料只能在乙個方向上流動 具有固定的讀端和寫端。它只能用於具有親緣關係的程序之間的通訊 也是父子程序或者兄弟程序之間 它可以看成是一種特殊的檔案,對於它的讀寫也可以使用普通的...