Linux管道命令(pipe)
) 定義函數(shù): int pipe(int filedes[2]);3) 函數(shù)說明: pipe()會建立管道,并將文件描述詞由參數(shù)filedes數(shù)組返回。filedes[0]為管道里的讀取端 filedes[1]則為管道的寫入端。
簡單來說就是,一個命令的結(jié)果作為另外一個命令(結(jié)果)的輸入,管道是linux提供的一種常見的進(jìn)程通信工具,也是很多shell命令能夠靈活組合產(chǎn)生強(qiáng)大用途的一個重要工具。
管道:一個命令的輸出可以通過管道做為另一個命令的輸入。管道我們可以理解現(xiàn)實(shí)生活中的管子,管子的一頭塞東西進(jìn)去,另一頭取出來,這里“ | ”的左右分為兩端,左端塞東西(寫),右端取東西(讀)。
pipe就是一種半雙工的管道。其中,fd[1]用來向管道中寫入數(shù)據(jù),而fd[0]在另一端用來讀出數(shù)據(jù)。如果現(xiàn)有兩個進(jìn)程要利用pipe進(jìn)行通信。此時(shí),就要保證只能有一個寫入端和一個讀出端,即:fd[1]和fd[0]只能有一個。
UnixBench是一個類unix系(Unix,BSD,Linux)統(tǒng)下的性能測試工具,一個開源工具,被廣泛用與測試linux系統(tǒng)主機(jī)的性能。Unixbench的主要測試項(xiàng)目有:系統(tǒng)調(diào)用、讀寫、進(jìn)程、圖形化測試、2D、3D、管道、運(yùn)算、C庫等系統(tǒng)基準(zhǔn)性能提供測試數(shù)據(jù)。
Linux系統(tǒng)中mkfifo創(chuàng)建管道后,調(diào)用open打開失敗,不知道錯在哪兒
1、errno是個全局變量,在errno.h頭文件中定義,用于保存錯誤碼,方便根據(jù)錯誤碼來查詢出錯原因。這個mkfifo函數(shù)創(chuàng)建管道時(shí),如果有已存在的同名管道,就會將errno賦值為EEXIST。
2、或者,返回ENXIO錯誤(當(dāng)前打開操作沒有設(shè)置阻塞標(biāo)志)。總之就是一句話,一旦設(shè)置了阻塞標(biāo)志,調(diào)用mkfifo建立好之后,那么管道的兩端讀寫必須分別打開,有任何一方未打開,則在調(diào)用open的時(shí)候就阻塞。
3、管道讀寫規(guī)則:如果試圖從管道寫端讀取數(shù)據(jù),或者向管道讀端寫入數(shù)據(jù)都將導(dǎo)致錯誤發(fā)生 當(dāng)沒有數(shù)據(jù)可讀時(shí),read調(diào)用就會阻塞,即進(jìn)程暫停執(zhí)行,一直等到有數(shù)據(jù)來到為止。
Linux中為什么這條不能使用管道符|來做
需要超級用戶權(quán)限的命令:某些需要超級用戶權(quán)限的命令(如 su)無法在管道中使用,因?yàn)楣艿赖膱?zhí)行者通常是普通用戶而不是超級用戶。
豎線‘|’ ,在linux中是作為管道符的,將‘|’前面命令的輸出作為|后面的輸入。
利用Linux所提供的管道符“|”將兩個命令隔開,管道符左邊命令的輸出就會作為管道符右邊命令的輸入。 連續(xù)使用管道意味著第一個命令的輸出會作為 第二個命令的輸入,第二個命令的輸出又會作為第三個命令的輸入,依此類推。