2020-02-21
cat test.txt | grep 'hello'
這行命令表示在test.txt文件中查找包含單詞'hello'的句子庆锦。我們先解釋下這行命令是怎么實(shí)現(xiàn)的霞扬;
我們知道終端也是一個(gè)進(jìn)程椎例,當(dāng)我們輸入一個(gè)命令執(zhí)行時(shí)劳翰,其實(shí)是終端程序調(diào)用fork和exec產(chǎn)生一個(gè)子進(jìn)程執(zhí)行命令程序链蕊;當(dāng)終端在執(zhí)行這行命令時(shí)事甜,會(huì)先解析輸入的參數(shù)谬泌,當(dāng)發(fā)現(xiàn)輸入的命令行中有‘|’符號(hào)時(shí)滔韵,就會(huì)知道在命令行中包含了管道,因此掌实,在終端程序中:
- 會(huì)先f(wàn)ork出一個(gè)子進(jìn)程陪蜻,并執(zhí)行exec將cat載入內(nèi)存;
- 接著在cat程序中贱鼻,用函數(shù)pipe定義出管道;
- 在定義出管道之后宴卖,再調(diào)用fork,生成一個(gè)子進(jìn)程邻悬;
- 在父進(jìn)程cat中關(guān)閉管道讀端症昏,將cat進(jìn)程的標(biāo)準(zhǔn)輸出重定向到管道的寫端;
- 在子進(jìn)程中將管道的寫端關(guān)閉父丰,將標(biāo)準(zhǔn)輸入重定向到管道的讀端肝谭,再調(diào)用exec將grep進(jìn)程載入內(nèi)存;
- 最后,cat的輸出就可以最為grep的輸入了攘烛;
這里需要說(shuō)明的是魏滚,父進(jìn)程cat對(duì)管道的操作必須在fork之前,否則父進(jìn)程cat對(duì)管道的操作會(huì)繼承到子進(jìn)程坟漱,這樣會(huì)導(dǎo)致子進(jìn)程無(wú)法讀取父進(jìn)程的數(shù)據(jù)