|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
管道简介" j$ l& i; l, ~ L' z' C
- y$ k3 g6 P8 ^; h3 n6 Z
管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入(其实我更愿意将管道比喻为农村浇地的管子)。Linux的管道主要包括两种:无名管道和有名管道。这一节主要讲无名管道,首先介绍一下这两个管道。(特点很重要啊!)
\+ Y) h2 x6 g6 c$ O: j- ]( v$ r+ Q
# m& z# y& c" v P8 ^0 t3 H1、无名管道3 {8 q- D% z5 c! E
$ |: H) `% h2 g% O 无名管道是Linux中管道通信的一种原始方法,如图一(左)所示,它具有以下特点:
0 ^) D3 D$ S/ ~" Y+ A
! r9 j9 X" w& o2 J! ~, O# q4 M* U8 ` ① 它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间);
1 p/ V5 G5 M9 y9 [
p3 l- {# o% m1 u5 H ② 它是一个半双工的通信模式,具有固定的读端和写端;
5 T0 f0 P; {4 F8 o5 s$ [
( l3 v3 o+ ?% Q4 ?3 A ③ 管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的 read()、write()等函数。但它不是普通的文件,并不属于其他任何文件系统并且只存在于内存中。
/ t9 y$ _0 g4 r$ l% j6 m/ C N: Y" ]- U" Y* {; x
2、有名管道(FIFO)/ o$ |: u4 y2 w3 @, h6 k
2 l# X1 v5 n, {! S
有名管道是对无名管道的一种改进,如图1(右)所示,它具有以下特点:' v$ q9 N# _- u. G$ h& h
) s. Q& z2 g4 I& r
① 它可以使互不相关的两个进程间实现彼此通信;
1 i+ Y2 h" n$ ^/ X) C- c+ m+ l a7 R- Z- T3 j6 [9 r
② 该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当做普通文件一样进行读写操作,使用非常方便;$ ]* q: u4 e* F; f% y
. {1 I8 u+ k5 l' E- a+ Q& ] ③ FIFO严格地遵循先进先出规则,对管道及FIFO的读总是从开始处返回数据,对它们的写则是把数据添加到末尾,它们不支持如 lseek()等文件定位操作。+ p9 h* D& k2 P* p/ m* U; T4 f
k9 k% |7 S% j
3 [- ?0 j/ W( O) C: I
: n% `7 c/ I# G6 l8 [& X1 o无名管道及其系统调用
7 s# q" O H+ O2 t& j. U' `
- [" D/ c% l/ _% x, U1、管道创建与管道说明$ a9 X6 [$ K# i& A
# j7 O7 i! u; q% m2 p P/ Z
管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1],其中fd[0]固定用于读管道,而fd[1]固定用于写管道,如图2所示,这样就构成了一个半双工的通道。6 a$ `1 ~) y2 m% [5 ^1 L* P. l
9 j2 d% |5 H9 s, a& I
- ^' I$ R5 q) \ H& Q5 O) y5 u
, V9 ]. @4 X# M/ o6 w" m2 E1 d8 E; ^. G* O6 j
|
|