|
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
|
|