国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 操作系統(tǒng) > 正文

進(jìn)程之間通過管道通信1

2024-06-28 13:24:25
字體:
供稿:網(wǎng)友
進(jìn)程之間通過管道通信1

  在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ù)是:

  • 要啟動(dòng)的程序(包括路徑)。
  • arg[0]: 程序名。
  • arg[1]:被啟動(dòng)的進(jìn)程準(zhǔn)備讀取的文件描述符。
  • (char *)0:表示終止被調(diào)用程序的參數(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ì)》(第三版)。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 济南市| 三明市| 怀集县| 成安县| 临朐县| 泸州市| 黑水县| 万盛区| 惠来县| 淳化县| 布尔津县| 凌云县| 锡林郭勒盟| 额尔古纳市| 西乌珠穆沁旗| 江源县| 昌都县| 泸西县| 罗源县| 浪卡子县| 大化| 乐东| 甘孜| 左云县| 延川县| 罗城| 台山市| 嘉善县| 贵定县| 三台县| 青阳县| 辽阳县| 华亭县| 依安县| 乌拉特后旗| 高密市| 化德县| 万山特区| 海原县| 新平| 宣恩县|