在linux的shell命令中,可以通過管道操作符'|'來連接進(jìn)程。在這里,我們通過使用pipe在程序中實(shí)現(xiàn)這種效果。
pipe函數(shù)原型如下:
#include<stdio.h>
int *pipe(int file_descriptor[2]);
函數(shù)說明:
file_descriptor為由兩個(gè)整形的文件描述符組成的數(shù)組指針。寫到file_descriptor[1]的所有數(shù)據(jù)都可以從file_descriptor[0]讀回來。函數(shù)執(zhí)行成功則返回0,否則返回-1。
示例1:子進(jìn)程讀取父進(jìn)程信息
創(chuàng)建pipe1.c文件,在這個(gè)程序,我們使用pipe來創(chuàng)建一個(gè)管道,由父進(jìn)程給出autorName字符串并且寫到file_descriptor[1]中,然后子進(jìn)程從file_descriptor[0]中讀出并顯示。

說明:我們開始調(diào)用pipe來創(chuàng)建一個(gè)管道,接著用fork映像出一個(gè)新的進(jìn)程。forkResult的值為0時(shí)表示在子進(jìn)程,為大于0的值在父進(jìn)程。因此,子進(jìn)程會(huì)執(zhí)行case 0語句,而父進(jìn)程會(huì)執(zhí)行default語句。父進(jìn)程將autorName字符串寫入管道(file_descriptor[1]),而子進(jìn)程從管道中讀取出來(file_descriptor[0])。需要說明的是,兩個(gè)進(jìn)程是同時(shí)運(yùn)行的。
接下來,我們編譯程序:
$gcc -o pipe1 pipe1.c
運(yùn)行,效果如下:

為什么上面的子進(jìn)程打印出來的消息會(huì)在命令提示符后面呢?原因是父進(jìn)程比子進(jìn)程先結(jié)束!
示例2:不同的進(jìn)程
示例1我們是通過fork創(chuàng)建一個(gè)與父進(jìn)程一模一樣的進(jìn)程,在接下來的示例中,我們使用的是兩個(gè)不同的進(jìn)程。在這個(gè)例子,我們使用了一個(gè)替換進(jìn)程的函數(shù)execl()。
編寫pipe3.c文件:

pipe4.c負(fù)責(zé)讀取數(shù)據(jù),如下:

說明:pipe3.c的作用與pipe1.c的作用差不多,在父進(jìn)程中,添加了由execl函數(shù)啟動(dòng)pipe4進(jìn)程,execl的參數(shù)是:
pipe4被啟動(dòng)后,將通過read讀取由execl傳入的參數(shù),編譯并運(yùn)行效果如下:

解析:執(zhí)行pipe3,首先父進(jìn)程調(diào)用fork函數(shù)創(chuàng)建出一個(gè)與父進(jìn)程一模一樣的子進(jìn)程。父進(jìn)程調(diào)用write向管道(file_descriptor[1])寫入autorName信息后,子進(jìn)程通過使用sPRintf函數(shù)向管道(file_descriptor[0])取數(shù)據(jù)(當(dāng)管道數(shù)據(jù)為空時(shí),子進(jìn)程將會(huì)阻塞,直到有數(shù)據(jù)寫入)。然后,一方面子進(jìn)程調(diào)用execl函數(shù),將子進(jìn)程替換成pipe4進(jìn)程,并把信息通過buffer傳遞給新的進(jìn)程;另一方面,父進(jìn)程打印出wirte data信息后結(jié)束進(jìn)程,命令提示符出現(xiàn)。pipe4通過argv接收數(shù)據(jù),并在命令提示符后面打印出來!
注釋:以上參考《linux程序設(shè)計(jì)》(第三版)。
新聞熱點(diǎn)
疑難解答
圖片精選