Linux 程序通訊之管道

2021-09-07 12:37:14 字數 2327 閱讀 8508

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

管道包含無名管道和有名管道兩種。無名管道僅僅能用於父程序和子程序間的通訊,而有名管道能夠用於同一系統中的隨意兩個程序間的通訊。

int pipe(int pipefd[2]);

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

#pipefd[0] 用於讀管道,

#pipefd[1] 用於寫管道。

#pipe()函式建立的管道預設是開啟的.演示樣例程式:

#include 

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char** ar**)

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 *ar**)

}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 *ar**)

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

return

0;}

linux程序通訊之管道

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

Linux 程序通訊之管道

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

linux程序間通訊之管道通訊

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