前提:原來也寫過匿名管道的**但是總覺得沒有了解過底層,只是知道 管道是乙個檔案它存在與記憶體上,一般父子程序之間使用但是並沒有研究過底層。所以這次參考linux核心情景分析這本書進行整理。(因為對linux虛擬檔案系統的了解因此這次對於匿名管道也有多幫助畢竟他也是個檔案哈哈哈哈哈開始吧)
它的系統呼叫是pipe();因為這是是在乙個程序中呼叫的所以你懂得 必須要在有關係的程序間使用比如父子,或這子子,;
#include int pipe(int pipefd[2]);
#include #include #include #include #include int main()
; if(read(fd[0],buff,128)==0)
printf("%s\n",buff);
} }
else
; fgets(buff,128,stdin);
if(strncmp(buff,"end",3)==0)
write(fd[1],buff,127);
} }
exit(0);
}
必須是一端讀另一段寫所以要關閉不許要的那一段要不有可能會出現問題具體自己想形象,半工的所以想讓我們使用必須建立兩個匿名管理進行雙工通訊,或者使用socketpair這個是雙工。
因為我前面的文章對虛擬檔案系統有過敘述所以,每個fd所對應的都是乙個stuct file結構體我們叫做檔案表的東西。乙個管道檔案對檔案的操作必須要在兩個檔案中進行,分別代表兩端,所一雖然在兩個程序中但是管道的兩端是兩個file結構體,當建立完之後乙個file對檔案的操作是唯讀,另乙個 是寫。所以不同問檔案file獲取的是不同的f_op 對於0端是寫的f_op 對於讀端的類似與其他啊。
所以get_empty_file 是從空閒的file鍊錶獲取兩個file結構體,這個前面也說過這只是管理檔案並不是檔案。。
所以對於檔案的偏移兩個都是0;對於管道而言也是乙個檔案所以給他建立檔案索引。建立inode,
獲取到空間的inode然後將其指向自己的檔案系統 pipe_mnt; 所以該inode對應的super塊給了inode 。
對於 inode_fop 他的操作是super塊提供的這個東西不同的檔案系統給自己的inode檔案是不同的。
inode 結構體中有乙個i_pipe然後對於一般問價而言這個指標都是空但是對於管道檔案指向的是乙個結構體叫做
pipe_inode_info 這個結構體中定義了pipe_readers 和 pipe_writers兩個巨集這兩個巨集主要是在get_pipe_inode 中 使用的。 主要作用記錄當前讀者和寫著的個數;
對於管道的i_op 因為他不是一般檔案所以這為空。
接下來咱們對於一些情況進行分析dup2,這個函式好多人都是用過。具體的情況我不理解。
對於管道檔案系統而言,read的底層實現。
sys_read()->pipe-read()
對於有資料了直接 去讀就行如果沒有資料是如何處理的?
具體參考**
if(pipe_empty(*inode))
ret =-eagin;
if(filp->f_flags & o_nonblock)
for(;;)
if(!pipe_empty(*inode))//檔案 中有資料跳出去
break;
if(!pipe_writers(*indoe))//寫的個數為0跳出去
go out;}
基於上面我們可以想出幾條懂
read時候可能會返回的情況對於阻塞的io訊號打斷返回,有資料了返回,最後寫者個數是0 返回。
對於設定了非阻塞的io 沒有資料會直接返回 -1 -eagin
一般來說管道的大小是4kb一般會給管道分配乙個記憶體頁當做自己的儲存空間。所以read讀到資料也會分為3中情況,1.剛好讀完管道中的資料返回讀到的個數,2,讀的個數小於管道中的個數返回讀的個數3讀的多餘管道中的返回管道中的。經過測試實際上在linux2.6.11版本之後pipe的大小為65536以前是4096;
對於write而言也有三種狀況具體分析
當管道的讀端關閉,如果繼續寫就會發生sigpipe
如果管道寫滿設定了阻塞就會阻塞;
如果是非阻塞管道滿了的話就會返回-eagin (具體記性** 部分分析)count 記錄當前
程序間通訊 匿名管道
最近實現乙個遠端超級終端的功能,通訊模式是這樣的 客戶端 通過網路傳送cmd命令到 伺服器端 通過程序間通訊 管道 將此cmd命令發給 cmd.exe程式,cmd.exe執行此cmd命令 接下來 cmd.exe 程式將執行結果返回 伺服器端 傳送此次結果到 客戶端,客戶端對結果進行顯示 其中伺服器端...
程序間通訊 匿名管道
1.程序通訊的目的 1 資料傳輸 乙個程序需要將它的資料傳輸給另乙個程序 2 資源共享 多個程序之間共享同樣的資源 3 通知事件 乙個程序需要向另乙個或一組程序傳送訊息,通知它們發生了什麼事情 2.管道 管道是一種程序之間通訊的一種方式,我們把從乙個程序連線到另乙個程序的資料流叫做管道 3.匿名管道...
程序間通訊 匿名管道
使用匿名管道做程序通訊,需要用父程序建立乙個子程序,該子程序的標準輸入輸出控制代碼由父程序指定。無論父程序還是子程序,都可以收發資料,這裡僅演示父程序發資料,子程序列印資料。父程序迴圈從控制台讀資料,並傳送給子程序,子程序用對話方塊列印資料,約定子程序收到 quit 後退出。define crt s...