Linux 程序通訊之管道

2021-07-04 07:10:35 字數 2280 閱讀 9690

管道是單向的、先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序(寫程序)在管道的尾部寫入資料,另乙個程序(讀程序)從管道的頭部讀出資料。資料被乙個程序讀出後,將被從管道中刪除,其他讀程序將不能再讀到這些資料。管道提供了簡單的流控制機制,程序試圖讀空管道時,程序將阻塞。同樣,管道已經滿時,程序再試圖向管道寫入資料,程序將阻塞。

管道包括無名管道和有名管道兩種,無名管道只能用於父程序和子程序間的通訊,而有名管道可以用於同一系統中的任意兩個程序間的通訊。

int pipe(int pipefd[2]);

#當乙個無名管道建立時,它會建立兩個檔案描述符:

#pipefd[0] 用於讀管道,

#pipefd[1] 用於寫管道。

#pipe()函式建立的管道預設是開啟的.

示例程式:

#include 

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char** argv)

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

if( pid > 0)

return0;}

#對於無名管道的讀、寫、關閉操作,與普通檔案的操作是一樣的。

mkfifo

[option]

filename

2、在程式中呼叫mkfifo()函式

int mkfifo(const

char *pathname, mode_t mode);

mkfifo()函式會依據引數 pathname 建立特殊的fifo檔案(有名管道),該檔案必須不存在,而引數mode為該檔案的許可權。mkfifo()建立的fifo檔案其他程序都可以用讀寫一般的檔案方式訪問。mkfifo()建立的fifo檔案預設是關閉的,當使用open()函式開啟檔案時需要注意和普通檔案的區別:

1、不能以o_rdwr模式開啟fifo檔案進行讀寫操作,這樣做的行為是未定義的。因為管道是單向的,如果需要在程式之間雙向傳遞資料,使用一對有名管道即可。

2、對標誌位的 o_nonblock 標誌的用法。

o_rdonly、o_wronly和o_nonblock標誌共有四種合法的組合方式:

flags=o_rdonly:open將會呼叫阻塞,除非有另外乙個程序以寫的方式開啟同乙個fifo,否則一直等待。

flags=o_wronly:open將會呼叫阻塞,除非有另外乙個程序以讀的方式開啟同乙個fifo,否則一直等待。

flags=o_rdonly|o_nonblock:如果此時沒有其他程序以寫的方式開啟fifo,此時open也會成功返回,此時fifo被讀開啟,而不會返回錯誤。

flags=o_wronly|o_nonblock:立即返回,如果此時沒有其他程序以讀的方式開啟,open會失敗開啟,此時fifo沒有被開啟,返回-1。

示例程式:

#fifo_read.c

#include

#include

#include

#include

#include

#include

#include

#define fifo_file "/tmp/myfifo"

int main(int argc, char *argv)

}if( (fd = open(fifo_file,o_rdonly | o_nonblock)) == -1)

while(1)

sleep(1);

printf("read is %s !\n",buf);

}unlink(fifo_file);

return

0;}

# fifo_write.c

#include

#include

#include

#include

#include

#include

#include

#define fifo_file "/tmp/myfifo"

int main(int argc, char *argv)

if (write(fd,"hello world",12) == -1)

return

0;}

linux程序通訊之管道

管道 可分為普通管道和命名管道。普通管道用於有親緣關係的程序間的通訊 父子程序 命名管道,通過給管道命名的方式,使得管道變成檔案系統中的管道檔案,從而允許無親緣關係的程序間通過訪問管道檔案進行通訊。管道是單向的,一端只能用於輸入,另一端只能用於輸出。管道是fifo的,即先進先出的,向管道中寫入的資料...

Linux 程序通訊之管道

管道是單向的 先進先出的,它把乙個程序的輸出和還有乙個程序的輸入連線在一起。乙個程序 寫程序 在管道的尾部寫入資料,還有乙個程序 讀程序 從管道的頭部讀出資料。資料被乙個程序讀出後,將被從管道中刪除,其它讀程序將不能再讀到這些資料。管道提供了簡單的流控制機制,程序試圖讀空管道時,程序將堵塞。相同,管...

linux程序間通訊之管道通訊

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