找回密码
 注册
关于网站域名变更的通知
查看: 183|回复: 1
打印 上一主题 下一主题

Linux进程间通信(2)学习一下管道通信之无名管道和他的基础实验

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-9-24 10:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
管道简介* u. k: w# ^' ^; K) Y
* l( }- x  _! [: R7 i
   管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入(其实我更愿意将管道比喻为农村浇地的管子)。Linux的管道主要包括两种:无名管道和有名管道。这一节主要讲无名管道,首先介绍一下这两个管道。(特点很重要啊!)' k# x9 ?' a) v* Z& A& }

, ]% t& `& Z. }4 v- N# n5 ]( X1、无名管道
5 ?  {' d3 A" d& z0 r
% x; e7 M1 s8 r! g/ L! O   无名管道是Linux中管道通信的一种原始方法,如图一(左)所示,它具有以下特点:# b& k' W. A% V' c( g

1 K% M0 C  O; A4 r5 M   ①  它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间);# ]" V! `) `" q) n3 c  S

0 X1 Q3 b4 i$ K4 w# ?6 r( V   ②  它是一个半双工的通信模式,具有固定的读端和写端;
7 x: b2 m3 D0 ~" H# t* W
8 a. [8 V7 q6 W9 m8 M) l- ?   ③   管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的 read()、write()等函数。但它不是普通的文件,并不属于其他任何文件系统并且只存在于内存中。
6 N/ C& ~) y. g: f, }" b( L' K5 w8 `/ x) f
2、有名管道(FIFO)# f( T; p9 @3 Y- z8 v( ]' k9 z1 x

; n! v3 e, @" d    有名管道是对无名管道的一种改进,如图1(右)所示,它具有以下特点:
: M# T* F( E0 G% X4 J$ p/ o- B8 i4 |  v! M8 u" m9 W& ?
    ①  它可以使互不相关的两个进程间实现彼此通信;  O: k( E1 {0 h) p; S
) L% m( U! z6 t
    ②  该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当做普通文件一样进行读写操作,使用非常方便;
" `2 e/ p: a/ M
# I! `8 n  L) ]* O) O! C/ A1 k5 t    ③  FIFO严格地遵循先进先出规则,对管道及FIFO的读总是从开始处返回数据,对它们的写则是把数据添加到末尾,它们不支持如 lseek()等文件定位操作。7 \2 L! s; }- X* @' Y; d: c. _

4 a7 E8 G* e$ ^   
" M/ c( e- N: K! u: y

* T" I- t/ K! x2 G8 F7 i无名管道及其系统调用
" j! h4 A$ G. j- b' B
/ T4 U& R: b+ s% a1、管道创建与管道说明

5 V/ ?6 Q! L- |6 `# x
$ E$ w. V$ c7 P0 L# ~    管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1],其中fd[0]固定用于读管道,而fd[1]固定用于写管道,如图2所示,这样就构成了一个半双工的通道。
4 w: D. ?5 i2 l4 l0 H& A9 ^
( i( ^/ e+ b& o. E2 G4 n
游客,如果您要查看本帖隐藏内容请回复

2 b, p) }5 M: I, b9 m+ C' d0 v/ D! H4 L9 M' ^# R
; Z( {7 v) {/ @; z' ]- x  U
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-24 03:00 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表