命名管道和匿名管道

2021-08-21 10:22:41 字數 1910 閱讀 3488

我們知道程序間是可以通訊的。可以達到資料傳輸、資源共享、事件通知、程序控制等目的。程序間通訊主要包括管道、系統ipc,套接字等。

管道分為三種:

1、普通管道

int pipe(int fds[2]);//返回值0表示成功,-1表示失敗

fd[0]:讀 fd[1]:寫

子程序往管道中寫資料,寫資料時要關閉讀端

父程序往管道中讀資料,寫資料時要關閉寫端

利用管道實現簡單的操作,在管道中寫入資料再讀出:

#include 

2#include

3#include

4#include 56

int main(void)

7 else;

23int r=read(fds[0],buf,100);//將管道中的資料讀到buf中,返回值是實際讀取的位元組數

24if(r==0)//讀取的自己為0,代表讀取檔案結束

25printf("read eof\n");

26else

if(r==-1)

29else

if(r>0)

30printf("buf=[%s]\n",buf);

31 close(fds[0]);//讀取成功,關閉讀端

2、匿名管道 :

管道的建立

管道檔案大小為0,沒有情緣關係的檔案也能通過管道名,來取到該管道中的快取。

//建立管道檔案

int mkfifo(const char *name,mode_t mode)

//開啟管道檔案

int fd=open(name,o_rdonly);讀

int fd=open(name,o_wronly);寫

//read/write,語義和匿名管道一樣

利用命名管道實現檔案的複製,**如下:

1)、將檔案寫入命名管道中

#include 

#include

#include

#include

#include

int main(char argc,char *argv)

close(infd);

close(outfd);

return

0;}

2)、將管道中的資料匯入到拷貝檔案中

#include 

#include

#include

#include

#include

int main(int argc,char *argv)

close(infd);

close(outfd);

unlink("tp");//刪除指定名字的檔案

return

0;}

3、匿名管道和命名管道的區別:

匿名管道是由pipe函式建立 並開啟的

命名管道是由mkfifo函式建立 的 ,開啟用open

命名管道和匿名管道唯一的區別就是在建立的開啟,一旦這些工作完成後,它們有相同的意義。

命名管道 匿名管道

有名字 則可以通過 名字 開啟相同的管道進行通訊,沒有名字 在核心中沒有明確標識 只能通過 子程序複製父程序的方式實現通訊,複製了檔案描述符 匿名管道只能用於具有親緣關係的程序間通訊。只要在建立程序之前建立管道,後邊的程序都可以實現通訊。命名管道可用於同一主機任意程序間通訊 作業系統在核心提供的一塊...

命名管道與匿名管道

匿名管道 父程序 include include main process information pp 定義結構體security attributes變數 char text 匿名管道程式測試!dword writetext ss.nlength sizeof ss 填充結構體中的各成員 ss....

linux中匿名管道和命名管道

1 建立管道和父子程序,子程序關閉讀端,父程序關閉寫端,子程序寫,父程序讀。2 如果所有指向管道寫端的檔案描述符都關閉了 管道寫端的引用計數等於0 而仍然有程序 從管道的讀端讀資料,那麼管道中剩餘的資料都被讀取後,再次read會返回0,就像讀到檔案末尾一樣。3 如果有指向管道寫端的檔案描述符沒關閉 ...