在linux的shell命令中,可以通過管道操作符'|'來連接進程。在這里,我們通過使用pipe在程序中實現這種效果。
pipe函數原型如下:
#include<stdio.h>
int *pipe(int file_descriptor[2]);
函數說明:
file_descriptor為由兩個整形的文件描述符組成的數組指針。寫到file_descriptor[1]的所有數據都可以從file_descriptor[0]讀回來。函數執行成功則返回0,否則返回-1。
示例1:子進程讀取父進程信息
創建pipe1.c文件,在這個程序,我們使用pipe來創建一個管道,由父進程給出autorName字符串并且寫到file_descriptor[1]中,然后子進程從file_descriptor[0]中讀出并顯示。
說明:我們開始調用pipe來創建一個管道,接著用fork映像出一個新的進程。forkResult的值為0時表示在子進程,為大于0的值在父進程。因此,子進程會執行case 0語句,而父進程會執行default語句。父進程將autorName字符串寫入管道(file_descriptor[1]),而子進程從管道中讀取出來(file_descriptor[0])。需要說明的是,兩個進程是同時運行的。
接下來,我們編譯程序:
$gcc -o pipe1 pipe1.c
運行,效果如下:
為什么上面的子進程打印出來的消息會在命令提示符后面呢?原因是父進程比子進程先結束!
示例2:不同的進程
示例1我們是通過fork創建一個與父進程一模一樣的進程,在接下來的示例中,我們使用的是兩個不同的進程。在這個例子,我們使用了一個替換進程的函數execl()。
編寫pipe3.c文件:
pipe4.c負責讀取數據,如下:
說明:pipe3.c的作用與pipe1.c的作用差不多,在父進程中,添加了由execl函數啟動pipe4進程,execl的參數是:
pipe4被啟動后,將通過read讀取由execl傳入的參數,編譯并運行效果如下:
解析:執行pipe3,首先父進程調用fork函數創建出一個與父進程一模一樣的子進程。父進程調用write向管道(file_descriptor[1])寫入autorName信息后,子進程通過使用sPRintf函數向管道(file_descriptor[0])取數據(當管道數據為空時,子進程將會阻塞,直到有數據寫入)。然后,一方面子進程調用execl函數,將子進程替換成pipe4進程,并把信息通過buffer傳遞給新的進程;另一方面,父進程打印出wirte data信息后結束進程,命令提示符出現。pipe4通過argv接收數據,并在命令提示符后面打印出來!
注釋:以上參考《linux程序設計》(第三版)。
新聞熱點
疑難解答