管道是單向的、先進先出的,它把乙個程序的輸出和另乙個程序的輸入連線在一起。乙個程序(寫程序)在管道的尾部寫入資料,另乙個程序(讀程序)從管道的頭部讀出資料。資料被乙個程序讀出後,將被從管道中刪除,其他讀程序將不能再讀到這些資料。管道提供了簡單的流控制機制,程序試圖讀空管道時,程序將阻塞。同樣,管道已經滿時,程序再試圖向管道寫入資料,程序將阻塞。
管道包括無名管道和有名管道兩種,無名管道只能用於父程序和子程序間的通訊,而有名管道可以用於同一系統中的任意兩個程序間的通訊。
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 用於寫管道 通常先建立乙個管道,再通...