管道
#includeint pipe(int fds[2]);
fd返回兩個檔案描述符,fd[0]讀,fd[1]寫!
管道是單雙工的,只能一端寫,另一端讀,不能兩邊同時讀寫
管道實際上是在,核心中開闢了乙個迴圈佇列,
當佇列寫滿(隊空)時,繼續寫(讀)管道會阻塞當前程序!
當寫端關閉,繼續讀時返回eof
當讀端關閉,繼續寫時候傳送sigpipe訊號,預設關閉程序
可能多個程序往管道寫,若指定寫的位元組數< 管道空間大小pip_buf,則寫資料不會交叉(獨佔寫,寫是院子操作)
若指定寫的位元組數》 管道空間大小pip_buf,則寫資料可能會交叉(寫滿管道,阻塞,管道有空間,大家一起競爭寫?)
pipe建立的管道只能用於有親緣關係的程序間通訊,父程序建立管道,fork子程序繼承檔案描述符,則可以父程序用fd[0]讀,子程序從fd[0]寫!
為確保,讀寫單向,讀端應該關閉寫fd[1],寫端關閉讀fd[0]
popen& pclose
#include
file *popen(const char *cmdstr, const char *type);
int pclose(file *fp);open 開乙個管道,然後呼叫fork,使用exec執行cmdstr 命令
返回乙個標準i/o流,type 為「r」返回標準讀,「w」返回標準寫即fd繫結為fd[1]
注意,因為管道作為標準輸入/出,所以預設使用全緩衝,可能造成讀不到,或者寫不到資料
在讀寫之前追號設定俄為行緩衝!
管道可在程式設計時候,作為中間處理**,插入某乙個流程,作為中間處理!
fifo
管道只能用於親緣關係的程序之間通訊fifo可以用於無關係的程序間通訊
可在磁碟中中建立乙個檔案,管道的inode會指向核心空間的,管道記憶體(迴圈佇列)
檔案的實際大小是0
通過檔案所有的程序就都能索引到管道的實際內容!
#include
int mkfifo(const char *path, mode_t mode);
int mkfifoat(int fd, const char *path, mode_t mode );
建立乙個fifo檔案,通過s_isfifo可以判斷是否文fifo檔案
open未指定o_nobliock(預設),讀(寫)開啟,無程序以寫(讀)開啟時,阻塞,知道有程序以寫(讀)開啟
fifo可以用來實現服務程序/客戶程序的模型
客戶以公用管道寫,大小應小於pipe_buf 以保證寫操作的原子性服務以私有管道寫,客戶從此管道讀(注意處理sigpipe,客戶程序可能以外終止)
shell 用來將資料從一條管道送到另一條管道,無須臨時檔案???
APUE 程序間通訊
現在,某些系統提供全雙工管道,但是為了最佳的可移植性,我們決不應預先假定系統支援全雙工管道。管道只能在具有公共祖先的兩個程序之間使用。通常,乙個管道由乙個程序建立,在程序呼叫fork之後,這個管道就能在父程序和子程序之間使用了。每當在管道中鍵入乙個命令序列,讓shell執行時,shell都會為每一條...
APUE筆記 高階程序間通訊
unix 域套接字 unix域套接字,使用socket相同的介面,用於程序間通訊 但它僅僅進行資料複製,不新增報頭,不計算校驗和 unix域套接字,在系統中建立兩個檔案,檔案不實際儲存資料,指向核心空間中相應位址 使用socketpair建立乙個類似於管道的socketfd fd 2 不同於管道,此...
APUE學習筆記 23 程序間通訊之管道
by 潘雲登 對於商業目的下對本文的任何行為需經作者同意。寫在前面 1.本文內容對應 unix 環境高階程式設計 第 2版 第 15章。2.總結了程序間通訊的一種機 制 管道的基本概念和使用方法。3.管道 管道是unix 系統ipc 的最古老形式,在 shell 下的表現形式為管道線。每當在管道線中...