|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
管道简介8 S1 X: I2 j: `8 d: Q: S
2 z' w5 F2 n- O- B 管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入(其实我更愿意将管道比喻为农村浇地的管子)。Linux的管道主要包括两种:无名管道和有名管道。这一节主要讲无名管道,首先介绍一下这两个管道。(特点很重要啊!)3 m8 Z) t. r/ s& M! D7 o) e# D
# x' G) [0 H4 r- ?9 [ T1、无名管道
I/ J# g$ P6 Q* P% J, c
$ J$ T+ ~' `: E: {" H5 Y 无名管道是Linux中管道通信的一种原始方法,如图一(左)所示,它具有以下特点:- w- f5 z% Y3 o, }! K. F
5 O; ?6 u5 }0 T% j% i6 v) D
① 它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间);
5 x& @+ b% Q+ x4 ~7 u8 ]* x1 T
* b5 l" b1 _0 p! M ② 它是一个半双工的通信模式,具有固定的读端和写端;
' M5 e& a% V! b* {) J5 F8 P1 d; Q* P* O- w8 [
③ 管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的 read()、write()等函数。但它不是普通的文件,并不属于其他任何文件系统并且只存在于内存中。
; A4 s D2 x7 l n
# p+ c' e0 s9 ]+ t4 N+ r: t5 }2、有名管道(FIFO): V: u8 n) M5 M) m; x2 s$ [
, b8 u$ C! u) C( C, R2 C
有名管道是对无名管道的一种改进,如图1(右)所示,它具有以下特点:* b* s- A v+ I/ \ J
# I( J3 V) Y9 L; Q# X
① 它可以使互不相关的两个进程间实现彼此通信;
6 C, w' l% p( m
; J1 f6 j& L0 o* ]0 N ② 该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当做普通文件一样进行读写操作,使用非常方便;
$ o, T# y; i: d# @
2 @7 d9 O) k+ ~( w ③ FIFO严格地遵循先进先出规则,对管道及FIFO的读总是从开始处返回数据,对它们的写则是把数据添加到末尾,它们不支持如 lseek()等文件定位操作。% b$ G* q$ ?+ ?8 y4 z4 l+ ~
6 v$ ?( V, E9 M
- a" v$ R/ ^% \* M0 c& f( q5 N$ D
: j2 y9 ?) _5 A: \3 {+ i无名管道及其系统调用
+ C$ I8 S3 R# E4 p" K$ c- Q
x, q3 W0 }0 G7 K7 i1 Z" m1、管道创建与管道说明
' l+ f* ~, @0 T8 l; P( y) z% W$ s* g- ?9 X) l4 S. g
管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1],其中fd[0]固定用于读管道,而fd[1]固定用于写管道,如图2所示,这样就构成了一个半双工的通道。
/ j" w( }( E- S" W" ^5 Q4 j. W) B% g
' Z# m. m g1 g1 n* j: L' \
1 Y! s. g$ b1 ^9 p% J7 P6 `- d
/ c. ~; W. n- ]6 w
2 K$ J- e0 P7 ~! M. d9 Y( V8 v% t5 B1 H |
|