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

2021-07-12 01:17:11 字數 3511 閱讀 6900

管道是最初的unixipc形式,但是因為管道沒有名字,所以它們只能用於有親緣關係的程序使用;進而有名管道(fifo)應運而生,有名管道有乙個路徑名與之關聯,所以允許無親緣關係的程序訪問同乙個fifo。

以下具體介紹管道

管道的建立:管道由函式 int pipe(int fd[2]) 建立,提供乙個單向資料流,該函式返回兩個檔案描述符,fd[0]和fd[1],前者用來開啟讀,後者用來開啟寫。

管道的用途:其典型用途就是為父子程序提供程序間通訊手段; 其過程是由乙個程序(它將成為父程序)建立乙個管道後呼叫fork派生乙個自身的副本,如圖所示,父程序關閉這個管道的讀出端,子程序關閉該管道的寫入端,這樣就在父子程序間形成了乙個單向資料流。

前面所述都是半雙工即單向的,只提供乙個方向的資料流的管道,若需要乙個雙向的資料流,就得建立兩個管道,每個方向乙個,具體的實現步驟如下:

其圖示如下:

該過程的乙個小小的示例如下:

#include 

#include

#include

#include

#include

#include

using namespace std;

int main()

; const char* child_talk = ;

int fd1[2], fd2[2];

int res1 = pipe(fd1);

int res2 = pipe(fd2);

if(res1 < 0)

if(res2 < 0)

pid_t pid;

pid = fork();

if(pid == 0)else

++i;

child = child_talk[i];

}close(fd1[0]);

close(fd2[1]);

}else

if(pid > 0)

close(fd2[0]);

close(fd1[1]);

int status;

wait(&status);

}else

return

0;}

該過程是建立了兩個管道,父程序用乙個管道的一端進行寫,子程序用該管道的另一端進行讀;子程序用另外乙個管道的一端進行寫,父程序用該管道的另一端進行讀;從而通過管道完成父子程序之間的通訊。

有名管道:

有名管道的建立: 其由函式 int mkfifo(const char *pathname, mode_t mode) 建立,該函式隱含指定許可權為o_creat | o_excl,即就是mkfifo要麼建立乙個新的fifo,要麼返回錯誤(因為所指定名字的fifo已經存在),若不想建立新的fifo,就直接用open開啟乙個已經存在的fiffo。

fifo不能開啟既用來讀又用來寫,因為fifo是半雙工的。

關於該fifo的乙個小小的示例如下:

//標頭檔案

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

char *write_fifo_name = "write_fifo";

const

char *read_fifo_name = "read_fifo";

//makefile檔案

all:ser cli

ser:ser.cpp

g++ ser.cpp -o ser

cli:cli.cpp

g++ cli.cpp -o cli

.phony:clean

clean:

rm ser cli

//伺服器端的**:

#include "utility.h"

int main()

write_fd = open(write_fifo_name, o_wronly); //只寫方式開啟寫管道

if(write_fd == -1)

printf("waiting client connecct.....\n");

while((read_fd = open(read_fifo_name, o_rdonly)) == -1)

printf("client connect ok.\n");

char sendbuf[256];

char recvbuf[256];

//進行伺服器和客戶端的通訊

while(1)

write(write_fd, sendbuf, strlen(sendbuf) + 1); //將伺服器端的資訊寫入傳送緩衝區

read(read_fd, recvbuf, 256); //讀取接收緩衝區的客戶端傳送的資料

printf("cli:>%s\n", recvbuf);

}return0;}

//客戶端的**:

#include "utility.h"

int main()

read_fd = open(write_fifo_name, o_rdonly); //唯讀方式開啟寫管道

if(read_fd == -1)

write_fd = open(read_fifo_name, o_wronly); //以只寫方式開啟讀管道,準備寫入客戶端要傳送的資料

if(write_fd == -1)

char sendbuf[256];

char recvbuf[256];

while(1)

write(write_fd, sendbuf, strlen(sendbuf) + 1); //將資料寫入到要傳送給伺服器端的緩衝區中

}return

0;}

最後來簡單的說一說管道和有名管道的區別:

(1)有名管道可以進行無親緣關係的程序間通訊,但是管道只能用於有親緣關係的程序間通訊。

(2)建立並開啟乙個管道只需要pipe函式就夠了,但是建立並開啟fifo需要在呼叫mkfifo後再呼叫open函式。

(3)管道在所有程序最終都關閉它之後自動消失,但是fifo只有在呼叫unlink後才能從檔案系統中刪除。

無名管道(PIPE)與 有名管道(FIFO)

更多資料 我的目錄 1 無名管道的建立 標頭檔案 include 函式原型 int pipe int pipefd 2 引數 pipefd 乙個至少具有兩個int型資料的陣列 pipefd 0 讀端的檔案描述符,只能讀取管道中的資訊 pipefd 1 寫端的檔案描述符,只能往管道中寫入資訊 返回值 ...

無名管道和有名管道

無名管道 無名管道建立 int pipe int filedis 2 當乙個管道建立時,它會建立兩個檔案描述符 filedis 0 用於讀管道,filedis 1 用於寫管道 管道用於不同程序間通訊。通常先建立乙個管道,再通過fork函式建立乙個子程序,該子程序會繼承父程序所建立的管道 有名管道 有...

無名管道和有名管道區別

管道 無名管道 1 管道通訊的原理 核心維護的一塊記憶體,有讀端和寫端 管道是單向通訊的 2 管道通訊的方法 父程序建立管理後fork子程序,子程序繼承父程序的管道fd 3 管道通訊的限制 只能在父子程序間通訊 半雙工 4 管道通訊的函式 pipe write read close 有名管道 fif...