管道和FIFO 有名管道 (一)

2021-08-18 12:54:13 字數 1387 閱讀 1880

管道與fifo

管道:由於沒有名字,只能在有共同祖先(有親緣關係)的程序間使用。管道普遍用於shell中,也可以在程式中實現子程序向父程序回傳資訊。

fifo: 有名管道,可在無親緣關係的程序間使用。

以上都使用read/write函式訪問。

管道由pipe函式建立,提供乙個單向資料流。

#include int pipe (int fd[2]);
該函式返回兩個檔案描述符:

fd[0]:用來讀取資料

fd[1]:用來寫入資料

管道雖然是單個程序建立的,但是卻很少在單個程序內使用。

典型用途是為兩個不同程序(父子程序)提供程序間通訊的手段。

當需要乙個雙向資料流時,我們必須建立兩個管道,每個方向乙個,步驟如下:

建立管道1(fd1[0]和fd1[1])和管道2(fd2[0]和fd2[1]);

fork建立子程序;

父程序關閉管道1的讀 fd1[0] 與 管道2的寫fd2[1];

子程序關閉管道1的寫 fd1[1] 與 管道2的讀fd2[0];

**實現程序間管道通訊

使用server程式代表子程序,使用client程式代表父程序。

#include #include #include #include #include #include #include #define maxlen 100

void client(int readfd,int writefd);

void server(int readfd,int writefd);

int main(int argc,char* argv)

close(pipe1[0]);/*父程序關閉pipe1的讀 與 pipe2的寫*/

close(pipe2[1]);

client(pipe2[0],pipe1[1]);/*父程序執行client 程式*/

waitpid(childpid,null,0);/*父程序等待子程序結束,取得已終止的子程序(殭屍程序)的終止狀態。

若無waitpid,則子程序將託孤給init程序,最終由init程序取得殭屍子程序的狀態。*/

exit(0);

} void client(int readfd,int writefd)/*引數分別為 pipe2[0],pipe1[1]*/

void server(int readfd,int writefd)/*引數對應pipe1[0],pipe2[1]*/

else

}

管道 無名管道 和FIFO 有名管道

管道是最初的unixipc形式,但是因為管道沒有名字,所以它們只能用於有親緣關係的程序使用 進而有名管道 fifo 應運而生,有名管道有乙個路徑名與之關聯,所以允許無親緣關係的程序訪問同乙個fifo。以下具體介紹管道 管道的建立 管道由函式 int pipe int fd 2 建立,提供乙個單向資料...

Linux c 管道和有名管道(FIFO)

一.管道 1.只能用於具有親緣關係的程序之間的通訊 2.半雙工通訊模式 3.一種特殊的檔案,是一種只存在於核心中的讀寫函式 管道基於檔案描述符,管道建立時,有兩個檔案描述符 a.fd 0 固定用於讀管道 b.fd 1 固定用於寫管道 建立管道 pipe 一般步驟 1.pipe 建立管道 2.fork...

管道(pipe)和有名管道(fifo)

pipe管道 1.先入先出的原則 2.int pipe db 2 無結構無固定大小的子節流 pipe pipe db 初始化 pipe db 0 用於讀取管道 close pipe db 1 read pipe db 0 buf len 將管道中內容讀到buf pipe db 1 用於寫管道 clo...