簡單的說,管道就是將乙個程式的輸出和另外乙個程式的輸入連線起來的單向通道。
當程序建立乙個管道的時候,系統核心同時為該程序設立了一對檔案控制代碼(乙個流),乙個用來從該管道獲取資料(read),另乙個則用來做向管道的輸出(write)。
事實上,在linux系統核心裡,每個管道都是用乙個inode節點來表示。
fork()的子程序自動繼承了父程序開啟的檔案控制代碼。利用繼承的控制代碼,就可以實現父/子間的通訊了。
1. 由c來建立,使用管道
使用系統函式pipe()來建立管道,它只有乙個引數:乙個有兩個成員的整型陣列,用於存放pipe()函式新建立的管道控制代碼。其函式原型如下:
系統呼叫: pipe();
函式宣告: int pipe( int fd[2] );
返回值: 0 on success
-1 on error: errno = emfile (no free descriptors)
emfile (system file table is full)
efault (fd array is not valid)
注意: fd[0] 用來從管道中讀, fd[1] 用來向管道中寫
2.使用dup()函式
有時候我們需要將子程序當中的管道的控制代碼定向到標準i/o上去。這樣,在子程序中使用exec()函式呼叫外部程式時,這個外部程式就會將管道作為它的輸入/輸出。這個過程可以用系統函式dup()來實現。其函式原型如下:
系統呼叫:dup();
函式宣告:int dup(int oldfd );
3. 有名管道
為了解決管道不能提供非父子關係程序間通訊的缺陷,在管道的基礎上發展了有名管道。其存在於檔案系統中的檔案節點。
《Linux網路程式設計》讀書筆記
去年買了 linux網路程式設計 這本,沒想到一放就是半年的時間了,慚愧啊!當年的雄心壯志都去哪了 好,廢話不多說,從今天開始,每天積累一點,厚積才能薄發,磨刀不誤砍柴工。工資趕快漲 漲 1991年,linux開始誕生了,到2011年,linux的版本從2.6直接蹦到了3.0,據說這個沒什麼大意義,...
Linux網路程式設計讀書筆記 4
第四章 基本套接字程式設計 4.1 基本套接字函式族 標頭檔案 主要函式 int socket int domain,int type,int protocol 建立socket 描述符 domain af unix,af i af iso type sock stream,sock dgram,s...
Linux網路程式設計讀書筆記 7
第九章高階套接字函式程式設計 9.1 傳送和接收函式的高階用法 標頭檔案 int send int sockfd,void buf,int len,int flags flags msg oob,msg dontwait,msg dontroute int recv int sockfd,void ...