什麼是管道
功能: 建立匿名管道
引數: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將會返回兩個...