(一)管道外部實現
當我們定義乙個管道時,這個管道
是由核心管理的乙個緩衝區,可以抽象為現實生活中的乙個傳輸線路。管道的一端連線乙個程序的輸出,這個程序會向管道中放入資訊。管道的另一端連線乙個程序的輸入,這個程序取出被放入管道的資訊。
當管道中沒有資訊的話,從管道中讀取的程序會等待,直到另一端的程序放入資訊。當管道被放滿資訊的時候,嘗試放入資訊的程序會等待,直到另一端的程序取出資訊。當兩個程序都終結的時候,管道也自動消失。
從原理上,管道利用fork機制建立,從而讓兩個程序可以連線到同乙個pipe上。
在linux中,管道是一種使用非常頻繁的通訊機制。從本質上說,管道也是一種檔案,但它又和一般的檔案有所不同,管道可以克服使用檔案進行通訊的兩個問題,具體表現為:
· (1)限制管道的大小。實際上,管道是乙個固定大小的緩衝區。在linux中,該緩衝區的大小為1頁,即4k位元組,使得它的大小不象檔案那樣不加檢驗地增長。使用單個固定緩衝區也會帶來問題,比如在寫管道時可能變滿,當這種情況發生時,隨後對管道的write()呼叫將預設地被阻塞,等待某些資料被讀取,以便騰出足夠的空間供write()呼叫寫。
· (2) 讀取程序也可能工作得比寫程序快。當所有當前程序資料已被讀取時,管道變空。當這種情況發生時,乙個隨後的read()呼叫將預設地被阻塞,等待某些資料被寫入,這解決了read()呼叫返回檔案結束的問題。
(二)管道的內部實現機制
實際上pipe並沒有單獨的實現資料結構,他利用了檔案的在
linux 中,而是借助了檔案系統的file結構和vfs的索引節點inode。通過將兩個 file 結構指向同乙個臨時的 vfs 索引節點,而這個 vfs 索引節點又指向乙個物理頁面而實現的。有兩個 file 資料結構,但它們定義檔案操作例程位址是不同的,其中乙個是向管道中寫入資料的例程位址,而另乙個是從管道中讀出資料的例程位址。這樣,使用者程式的系統呼叫仍然是通常的檔案操作,而核心卻利用這種抽象機制實現了管道這一特殊操作。
(三)管道的容量
當管道一端不斷地讀取資料,另一端卻不輸出資料。根據linux的實現機制當管道讀滿是輸出端自動阻塞。所以這個管道是有大小的
現在我們編寫程式來測試管道的大小#include
#include
#include
int main(int argc, char* argv)
ssize_t ret = -1;
int loop = 100;
if (argc > 1)
for (int i = 0; i < loop; ++i)
else
} // 當i=16的時候會阻塞,可知管道大小為64k
close(pipefds[0]);
close(pipefds[1]);
return 0;
}
linux下管道的容量以及實現機制
一 管道外部實現 當我們定義乙個管道時,這個管道是由核心管理的乙個緩衝區,可以抽象為現實生活中的乙個傳輸線路。管道的一端連線乙個程序的輸出,這個程序會向管道中放入資訊。管道的另一端連線乙個程序的輸入,這個程序取出被放入管道的資訊。當管道中沒有資訊的話,從管道中讀取的程序會等待,直到另一端的程序放入資...
Linux下管道的實現機制
檢視linux下管道的預設大小可以使用命令ulimit a 儘管命令ulimit a看到管道大小8塊,緩衝區的大小不是4 k,因為核心動態分配最大16 緩衝條目 乘64 k 驗證管道的容量 管道是一種最基本的 ipc機制,由pipe函式建立 呼叫pipe函式時在核心中開闢 一塊緩衝區 稱為管道 用於...
linux下管道命令
想必很多剛接觸linux尤其是在redhat環境下,大家都見過 rpm qa grep 或者rpm qa sort之類的命令,但是並不知道 是乙個什麼符號。管道符號,是unix功能強大的乙個地方,符號是一條豎線 用法 command 1 command 2 他的功能是把第乙個命令command 1執...