如何创建管道——pipe
我們有一個這樣的場景:主程序希望與子程序進行通信。我們用pipe()函數為他們創建管道,這樣他們就可以通過管道來通信了。
為了演示方便我們只考慮:
子程序把數據發送到父進程中來的情況。因此要用管道把子進程的標準輸出和父進程的標準輸入連接起來
我們將用pipe()函數建立管道。每當我們打開數據流時,它都會加入描述符表。pipe()函數也是如此,它創建兩條相連的數據流,并把它們加到描述符表中,然后只要我們往其中一條數據流中寫數據,就可以從另一條數據流中讀取。pipe()在描述符表中創建這兩項時,會把它們的文件描述符存放在一個包含兩個元素的數組中。
int fd[2]; //文件描述符將保存在fd數組中。 if(pipe(fd) == -1){fprintf(stderr,"Can't create the pipe!");exit(2); }pipe()函數創建了管道,并返回了兩個描述符:fd[0]用來從管道讀數據,fd[1]用來向管道寫數據。我們將在父、子進程中使用這兩個描述符。
我們通過一個實例來說明:
aaa.c
bbb.c
#include <stdio.h> int main(){char line[255];fgets(line,255,stdin);printf("%s",line);return 0; }編譯運行:
~/Desktop/MyC$ gcc aaa.c -o aaa ~/Desktop/MyC$ gcc bbb.c -o bbb ~/Desktop/MyC$ ./aaa |查進程信息:
~$ ps -ef UID PID PPID C STIME TTY TIME CMD wong 17525 5363 0 17:47 pts/1 00:00:00 ./aaa wong 17526 17525 0 17:47 pts/1 00:00:00 bbb輸入地址按回車:
~/Desktop/MyC$ ./aaa http://www.baidu.com接著就會打開瀏覽器。
管道是文件嗎?這不一定。這取決于操作系統創建管道的方式,一般來說用pipe()創建的管道都不是文件。而創建基于文件的管道,通常叫做有名管道或FIFO文件(先進先出文件)。
因為基于文件的管道有名字,所以兩個進程只要知道管道的名字也能用它來通信,即使它們是非父子進程關系。要使用有名管道,可以通過使用mkfifo()系統調用來實現。如果不是通過文件來實現管道的話,那通常是用內存,數據寫到內存某個位置,然后再從另一個位置讀取。
如果試圖讀取一個空的管道,也不會發生錯誤,因為程序會等待管道中出現東西。
父進程是如何知道子進程結束的?
其實,當子進程結束時,管道會關閉。fgets()將會收到EOF(End Of File,文件結束符) ,于是fgets()函數返回0,循環就結束了。
另外,管道只能單向通信。但是可以通過創建兩個管道,一個從父進程連接到子進程,另一個從子進程連接到父進程來實現雙向通信 。
謝謝閱讀!
總結
以上是生活随笔為你收集整理的如何创建管道——pipe的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 职场Word使用技巧大全,教你成为职场高
- 下一篇: java设计一个bank类实现银行_关于