Linux通訊管道演示

2021-10-08 20:14:55 字數 2323 閱讀 4213

無名管道特性

只能用於有親緣關係的程序(父子程序、兄弟程序)

資料之間單向流動(半雙工)

管道中資料不儲存,資料被讀走後便丟失

管道並不屬於任何檔案系統,只存在於記憶體當中

原函式

#include int pipe(int pipefd[2]);
當使用pipe()函式時需建立包含兩個檔案描述符的陣列:

父子程序間通訊

建立管道

父程序建立子程序(fork()函式)

父程序關閉管道的讀端(close(pipefd[0]))

父程序將資料通過寫端寫入管道

子程序關閉管道寫端(close(pipefd[1]))

子程序通過讀端讀取管道中資料

管道如水管一樣堵住一端才能將水進行存入或取出操作

示例父程序傳資料給子程序:

#include

#include

#include

#include

#include

intmain()

pid =

fork()

;if(pid <0)

else

if(pid >0)

else

return0;

}

原函式

#include #include int mkfifo(const char *pathname, mode_t mode);
呼叫mkfifo()函式後,將會建立乙個檔案格式的命名管道,可以使用對檔案的i/o函式進行操作

命名管道特性

若未設定o_nonblock(非阻塞)模式,當單方向(唯讀或只寫)開啟該管道時將會導致阻塞(程式無法退出),只有同時對管道操作程式才能正常結束,示例:

唯讀管道程式:

#include

#include

#include

#include

#include

intmain()

int fd =

open

("./file"

,o_rdonly)

;printf

("open succse\n");

return0;

}

只寫管道程式

#include

#include

#include

#include

#include

intmain()

int fd =

open

("./file"

,o_wronly)

;printf

("write open succse\n");

return0;

}

編譯後單方面程式執行將會導致阻塞,只有兩程式都執行才能使程式結束。

兩程式互相通訊

示例:

#include

#include

#include

#include

#include

#include

intmain()

;if(mkfifo

("./file"

,0600)==

-1&& errno != eexist)

int fd =

open

("./file"

,o_rdonly)

;printf

("open succse\n");

while(1

)close

(fd)

;return0;

}

#include

#include

#include

#include

#include

#include

intmain()

close

(fd)

;return0;

}

linux 程序通訊 管道通訊

程序通訊 1 pipe 函式的作用 建立無名管道 函式的原型 int pipe int fds 2 函式的引數 新建的兩個描述符fds陣列返回 fds 0 表示管道的讀取端 fds 1 表示管道的寫入端 返回值 成功 0 出錯 1 標頭檔案 include 2 mkfifo 函式的作用 建立有名管道...

linux程序通訊 管道

管道分為有名管道和無名管道。無名管道 無名管道是半雙工的,就是對於乙個管道來講只能讀或者寫。就像高速公路一樣一條路只能單向行駛。建立無名管道的函式 所需要標頭檔案 include 函式原型 int pipe int fd 2 函式的返回值 失敗返回 1,成功返回0 乙個簡單的無名管道的例子 main...

Linux 程序間通訊 管道通訊

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