新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 進程間通信之:管道

        進程間通信之:管道

        作者: 時間:2013-09-13 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/257127.htm

        8.2

        8.2.1概述

        本書在第2章中介紹“ps”的命令時提到過,當時指出了管道是中一種很重要的通信方式,它是把一個程序的輸出直接連接到另一個程序的輸入,這里仍以第2章中的“ps–ef|grepntp”為例,描述管道的通信過程,如圖8.2所示。

        圖8.2管道的通信過程

        管道是間通信的一種方式。這里所說的管道主要指無名管道,它具有如下特點。

        n 它只能用于具有親緣關系的之間的通信(也就是父子或者兄弟進程之間)。

        n 它是一個半雙工的通信模式,具有固定的讀端和寫端。

        n 管道也可以看成是一種特殊的文件,對于它的讀寫也可以使用普通的read()和write()等函數。但是它不是普通的文件,并不屬于其他任何文件系統,并且只存在于內核的內存空間中。

        8.2.2管道

        1.管道創建與關閉說明

        管道是基于文件描述符的通信方式,當一個管道建立時,它會創建兩個文件描述符fds[0]和fds[1],其中fds[0]固定用于讀管道,而fd[1]固定用于寫管道,如圖8.3所示,這樣就構成了一個半雙工的通道。

        圖8.3中管道與文件描述符的關系

        管道關閉時只需將這兩個文件描述符關閉即可,可使用普通的close()函數逐個關閉各個文件描述符。

        注意

        當一個管道共享多對文件描述符時,若將其中的一對讀寫文件描述符都刪除,則該管道就失效。

        2.管道創建函數

        創建管道可以通過調用pipe()來實現,表8.1列出了pipe()函數的語法要點。

        表8.1 pipe()函數語法要點

        所需頭文件

        #includeunistd.h>

        函數原型

        intpipe(intfd[2])

        函數傳入值

        fd[2]:管道的兩個文件描述符,之后就可以直接操作這兩個文件描述符

        函數返回值

        成功:0

        出錯:-1

        3.管道讀寫說明

        用pipe()函數創建的管道兩端處于一個進程中,由于管道是主要用于在不同進程間通信的,因此這在實際應用中沒有太大意義。實際上,通常先是創建一個管道,再通過fork()函數創建一子進程,該子進程會繼承父進程所創建的管道,這時,父子進程管道的文件描述符對應關系如圖8.4所示。

        此時的關系看似非常復雜,實際上卻已經給不同進程之間的讀寫創造了很好的條件。父子進程分別擁有自己的讀寫通道,為了實現父子進程之間的讀寫,只需把無關的讀端或寫端的文件描述符關閉即可。例如在圖8.5中將父進程的寫端fd[1]和子進程的讀端fd[0]關閉。此時,父子進程之間就建立起了一條“子進程寫入父進程讀取”的通道。

        圖8.4父子進程管道的文件描述符對應關系圖8.5關閉父進程fd[1]和子進程fd[0]

        同樣,也可以關閉父進程的fd[0]和子進程的fd[1],這樣就可以建立一條“父進程寫入子進程讀取”的通道。另外,父進程還可以創建多個子進程,各個子進程都繼承了相應的fd[0]和fd[1],這時,只需要關閉相應端口就可以建立其各子進程之間的通道。

        想一想

        為什么無名管道只能在具有親緣關系的進程之間建立?

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        linux相關文章:linux教程


        數字通信相關文章:數字通信原理


        通信相關文章:通信原理



        上一頁 1 2 3 4 5 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 繁昌县| 罗定市| 马鞍山市| 开远市| 绥宁县| 法库县| 华亭县| 永福县| 涞源县| 绍兴市| 万盛区| 嘉峪关市| 哈尔滨市| 泗水县| 厦门市| 旌德县| 林甸县| 平陆县| 合阳县| 大埔县| 甘南县| 南皮县| 阿勒泰市| 泸州市| 丰县| 清原| 麟游县| 怀来县| 清流县| 兴仁县| 玉山县| 涞水县| 慈利县| 怀仁县| 宜城市| 越西县| 黔南| 汾阳市| 济阳县| 贵南县| 乡宁县|