2、管道(無名管道):
a、只能用於具有親緣關係的進程之間通信;
b、半雙工模式,具有固定的讀端和寫端;
c、管道不是普通文件,不屬於任何文件系統,只存在於內存中;
d、當一個管道通過函數 int pipe(int fd[2]) 創建時,fd[0] 爲固定的讀端,fd[1] 爲固定的寫端;
e、對管道的讀寫,其實就是對內核緩衝區的讀寫;
注意:
I、 如果所有指向該管道讀端的文件描述符都已經關閉,而寫端繼續寫,則會收到SIGPIPE信號,通常會導致進程異常終止;
II、 如果所有指向該管道寫端的文件描述符都已經關閉,而讀端繼續讀,則讀端會繼續讀取完畢管道中的內容,讀完後再次讀取的時候,就會返回0 ,就像讀到文件末尾一樣;
III、如果指向該管道的文件的讀端和寫端都沒有關閉,但是寫端沒有向管道中寫入數據,這時,讀端會繼續讀取管道中剩餘的數據,讀取完畢後,阻塞等待,直到管道中再有數據;
IIII、如果指向該管道的讀端和寫端都沒有關閉,但是讀端不讀取任何數據,而寫端不斷寫入數據,當管道被寫滿時,就會阻塞等待;
3、標準流管道:
帶有緩衝區
函數: FILE* popen(char* command ,char* type);
int pclose(FILE* stream);
command 指的是路徑+文件名;
type表示的是讀寫方式,只能是其中一種方式,不能讀寫同時進行,當參數是兩個時,只取第一個的值;
wait4()被 pclose(FILE* stream)調用,等待管道進程運行結束,然後關閉文件流;