<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 進(jìn)程間通信之:管道

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

作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/257127.htm

8.2

8.2.1概述

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

圖8.2管道的通信過(guò)程

管道是間通信的一種方式。這里所說(shuō)的管道主要指無(wú)名管道,它具有如下特點(diǎn)。

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

n 它是一個(gè)半雙工的通信模式,具有固定的讀端和寫(xiě)端。

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

8.2.2管道

1.管道創(chuàng )建與關(guān)閉說(shuō)明

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

圖8.3中管道與文件描述符的關(guān)系

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

注意

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

2.管道創(chuàng )建函數

創(chuàng )建管道可以通過(guò)調用pipe()來(lái)實(shí)現,表8.1列出了pipe()函數的語(yǔ)法要點(diǎn)。

表8.1 pipe()函數語(yǔ)法要點(diǎn)

所需頭文件

#includeunistd.h>

函數原型

intpipe(intfd[2])

函數傳入值

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

函數返回值

成功:0

出錯:-1

3.管道讀寫(xiě)說(shuō)明

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

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

圖8.4父子進(jìn)程管道的文件描述符對應關(guān)系圖8.5關(guān)閉父進(jìn)程fd[1]和子進(jìn)程fd[0]

同樣,也可以關(guān)閉父進(jìn)程的fd[0]和子進(jìn)程的fd[1],這樣就可以建立一條“父進(jìn)程寫(xiě)入子進(jìn)程讀取”的通道。另外,父進(jìn)程還可以創(chuàng )建多個(gè)子進(jìn)程,各個(gè)子進(jìn)程都繼承了相應的fd[0]和fd[1],這時(shí),只需要關(guān)閉相應端口就可以建立其各子進(jìn)程之間的通道。

想一想

為什么無(wú)名管道只能在具有親緣關(guān)系的進(jìn)程之間建立?

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

linux相關(guān)文章:linux教程


數字通信相關(guān)文章:數字通信原理


通信相關(guān)文章:通信原理



上一頁(yè) 1 2 3 4 5 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>