程序間通訊(2) 管道

2021-08-21 21:03:51 字數 2745 閱讀 4125

管道:半雙工通訊

資料流向是單向的、先進先出的。只能乙個程序讀、乙個程序寫。資料從管道中讀出後,就會被刪除。如果管道中沒有資料,讀操作就會被阻塞,直到管道中有資料可讀;而如果管道的滿的,寫操作就會被阻塞,直到管道中有足夠大的空間可用。

有名管道(fifo):在任意兩個程序間通訊。有屬性資訊、inode結點存在磁碟上。

在檔案目錄樹中存在管道檔案標識。但是管道檔案不佔據磁碟空間,需要傳遞的資料快取在記憶體區域。

通過mknode() 系統呼叫或mkfifo()函式來建立。因為linux系統為每乙個檔案都提供了訪問許可權,所以只要兩個程序都有操作fifo的許可權,就能通過檔名將其開啟、進行讀寫。fifo在記憶體中釋放,但磁碟結點仍然存在。可以通過unlink函式刪除管道。

無名管道(pipe):用於父子程序之間。無屬性資訊,沒有inode結點。通過pipe()系統呼叫建立並開啟,當最後使用它的程序關閉對它的引用時,pipe自動撤銷。

通訊過程:(依然是檔案操作那一套):管道對於管道兩端的程序而言,就是乙個檔案,但它不是普通的檔案,它不屬於某種檔案系統,而是自立門戶,單獨構成一種檔案系統,並且只存在於記憶體中。

管道的實質是核心緩衝區,有名管道和無名管道都是通過核心緩衝區實現資料傳輸。

建立有名管道檔案  & 有名管道的使用:

(命令)mkfifo 檔名

(函式)int mkfifo(const char *pathname, mode_t mode)

第乙個引數將要在檔案系統中建立乙個專用檔案,第二個引數來規定fifo的讀寫許可權,不能用open建立乙個管道檔案。

/*

*寫端*/#include#include#include#include#include#include#include#define fifo "myfifo"

int main()

; int n;

//開啟管道

fd = open(fifo,o_wronly);

fgets(buff,127,stdin);

buff[strlen(buff) -1] == 0;

//向管道中寫入資料

n = write(fd,buff,strlen(buff));

close(fd);}

/* *讀端

*/#include#include#include#include#include#include#include#define fifo "myfifo"

int main()

; int n;

//建立管道

if((mkfifo(fifo, 0664)<0) && errno != eexist)

//開啟管道

fd = open(fifo,o_rdonly);

if(fd == -1)

//讀取資料

n = read(fd,buff,127);

printf("從管道中讀出的資料:%s\n",buff);

close(fd);

unlink(fifo);

}

有名管道檔案的操作:

建立:int mkfifo(const char *pathname, mode_t mode)

開啟:int open(char *path,int flag)

讀:int read( int fd, void *buff, size_t size)

寫:int write( int fd, void *buff, size_t size)

關閉:int close( int fd )

刪除:int unlink(const char *pathname)

一旦建立了乙個fifo,就可用open開啟它,但使用mkfifo函式建立管道時,注意在哪個程序原始檔中建立管道,就要先執行哪個程序,否則,另乙個程序會因為管道不存在而無法開啟管道。

建立無名管道 & 無名管道的使用:

int pipe(int filedis[2]);   0端用於讀管道,1端用於寫管道

#include#include#includeint main()

; int pipe_fd[2]; //有名管道的檔案描述符

if(pipe(pipe_fd) < 0) //建立有名管道

fd = fork(); //fork乙個子程序

if(fd == 0) //在子程序中

close(pipe_fd[0]);

exit(0);

} else if(fd > 0 ) //在父程序中

}

無名管道的操作:

建立管道:int pipe(int pipefd[2])

讀:int read( int fd, void *buff, size_t size)

寫:int write( int fd, void *buff, size_t size)

關閉:int close( int fd )

程序間通訊(2) 管道

管道 本質 核心的快取 管道分類 管道是程序間通訊中最古老的方式,它是指用於連線乙個讀程序和乙個寫程序以實現他們之間通訊的乙個共享檔案。我們將乙個程序到另乙個程序的資料流,稱之為 管道 它包括匿名管道和命名管道兩種。匿名管道 include h 功能 建立乙個無名管道 原型 int pipe int...

程序間通訊2管道

include include include 1.一般來說子程序和父程序通訊至少需要兩條管道 一條用於讀,一條用於寫 2.兩個程序得共享資源都不是同乙個,一般來說子程序產生得時候會將所有得資源拷貝乙份供子程序使用,所以父程序和子程序得資源不是同乙份 3.如果寫端的管道關閉之後,那麼讀端的就不會阻塞...

程序間通訊(2) 命名管道

命名管道的應用,正是為了克服匿名管道存在的這些缺陷。命名管道可以在沒有親緣關係的程序中應用,甚至在不同計算上的兩個程序也可以通過命名管道實現通訊,這是因為命名管道實際上是windows在網路介面上封裝的程序間通訊形式。命名管道可以實現一對多的通訊,同時也能實現雙向讀寫通訊。結合例子進行講解,例程如下...