管道是最初的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...