日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何创建管道——pipe

發布時間:2023/12/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何创建管道——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

#include <stdio.h> #include <unistd.h> #include <stdlib.h>void open_url(char *url); int main(){int fd[2];if(pipe(fd) == -1){ //創建管道,并把文件描述符保存在fd[0]和fd[1]中。fprintf(stderr,"%s\n","Can't create the pipe!");exit(1);}pid_t pid = fork();if(pid == -1){fprintf(stderr,"%s\n","Can't fork process!");exit(2);}if(!pid){ //能進這里,表示已在子進程中dup2(fd[1],1); //把標準輸出設為管道寫入端close(fd[0]); //因為子進程不會去讀取管道,因此將讀取端關閉if(execl("bbb","bbb",NULL) == -1){fprintf(stderr,"%s\n","Can't open subprocess");exit(1);}}//從這開始是屬于父進程的dup2(fd[0],0); //把標準輸入設為管道讀取端close(fd[1]);//因為父進程不會向子進程發數據,無需寫入管道,因此將寫入端關閉char line[255];while(fgets(line,255,stdin)){open_url(line+1);}return 0; } void open_url(char *url){char launch[255];//sprintf(launch,"cmd /c start %s",url); //在windows上打開網頁// system(launch);sprintf(launch,"x-www-browser '%s' &",url);//在Linux上打開網頁system(launch);//sprintf(launch,"open '%s'",url); //在Mac上打開網頁//system(launch); }

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。