Linux 匿名管道pipe與命名管道FIFO

2021-08-20 09:17:24 字數 3077 閱讀 9690

什麼是管道

功能: 建立匿名管道

引數:fd:⽂檔案描述符陣列,其中fd[0]表⽰示讀端, fd[1]表⽰示寫端

返回值: 成功返回0,失敗返回錯誤**

實現**

#include

#include

#include

#include

int main()

memset(buf,0x00,sizeof(buf));

//從管道中讀取

if((len=read(fds[0],buf,100)) == -1)

//顯示管道中內容

檔案描述符角度-深度理解管道

核心角度-管道本質

由此可見,管道的使用和檔案一樣,正如linux中的一切皆檔案思想。

fork程序**實現

#include

#include

#include

#include

#include

#define err_exit(m) \

do \

while(0)

int main()

; if(pipe(pipefd) == -1)//建立pipe管道

err_exit("pipe error");

pid_t pid;

pid = fork();//建立子程序

if(pid == -1)

err_exit("fork error");

if(pid == 0)

printf("pid = %d,ppid = %d\n",getppid(),getpid());//確認為父程序

close(pipefd[1]);//關閉寫操作

read(pipefd[0],buf,10);//讀10個字元

printf("buf = %s\n",buf);//顯示讀的字元

匿名管道讀寫規則

沒有資料時:

當管道滿時:

如果所有管道寫端對應的檔案描述符被關閉,則read返回0。

如果所有管道讀端對應的檔案描述符被關閉,則write操作會產生訊號sigpipe,進而可能導致write程序退出。

當要寫入的資料量不大於pipe_buf時,linux將保證寫入的原子性。

當要寫入的資料量大於pipe_buf時,linux將不再保證寫入的原子性。只能用於具有共同祖先的程序(具有親緣關係的程序)之間進行通訊;通常,乙個管道由乙個程序建立,然後該程序呼叫fork,此後父、子程序之間就可應用該管道。

管道提供流式服務。

一般而⾔言,程序退出,管道釋放,所以管道的生命週期隨程序。

管道是半雙工的,資料只能向乙個方向流動;需要雙方通訊時,需要建立起兩個管道。

進行不相關程序的程序間通訊。

命名管道可以從命令列上建立:

$ mkfilo filename
從程式建立:

int mkfile(const

char *filename,mode_t mode);

建立命名管道:

int main(int argc, char &argv)

讀操作:

寫操作:讀取檔案,寫入命名管道:

#include

#include

#include

#include

#include

#include

#include

#include

#define err_exit(m) \

do \

while(0)

int main()

close(infd);//關閉讀操作

close(outfd);//關閉寫操作

讀取檔案,從命名管道讀出:

#include

#include

#include

#include

#include

#include

#include

#include

#define err_exit(m) \

do \

while(0)

int main()

close(infd);

close(outfd);

unlink("tp.c");

return

0;}

linux 匿名管道pipe

管道是一種最基本的ipc機制,由pipe函式建立 include int pipe int filedes 2 呼叫pipe函式時在核心中開闢一塊緩衝區 稱為管道 用於通訊,它有乙個讀端乙個寫端,然後通 過filedes引數傳出給使用者程式兩個檔案描述符,filedes 0 指向管道的讀端,file...

pipe建立匿名管道

pipe建立的管道為匿名管道,匿名管道只能在有關係的程序之間使用,例如父程序和子程序,由同乙個父程序建立的子程序或稱為兄弟程序 如圖所示若管道只有乙個,並且管道只能程序單向通訊,因此,在子程序繼承父程序的檔案描述符之後,父程序關閉fd 0 檔案描述符,子程序關閉fd 1檔案描述符,這樣父程序和子程序...

linux管道通訊(pipe)

linux pipe適合於父子程序之間進行通訊。如下面 所示 include include include int main create sub process pid fork if 1 pid else if 0 pid else return 0 當呼叫fork函式後,fork將會返回兩個...