|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
有名管道(FIFO)
0 e1 F- j' }* J
$ J: U f- }0 a6 A9 p8 |; k 首先将上一节的有关有名管道的定义再贴出来3 t0 l- @* a7 H
* u5 L* \* [2 z8 j4 b2 r3 ~
有名管道是对无名管道的一种改进,它具有以下特点:6 S' d2 ~, G U1 ]7 e8 n; K: c0 N
: ^ D" _$ b: d ① 它可以使互不相关的两个进程间实现彼此通信;
; ]7 G6 D- V% }
5 G' A* v! x/ G( \) C ② 该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当做普通文件一样进行读写操作,使用非常方便;
$ v O" W7 { c/ L
% v% }- U B8 o5 y ③ FIFO严格地遵循先进先出规则,对管道及FIFO的读总是从开始处返回数据,对它们的写则是把数据添加到末尾,它们不支持如 lseek()等文件定位操作。
# h+ }: C, x6 r) ?. P
* [* b: R" A: p: K0 R+ `# Z 有名管道的创建可以使用函数 mkfifo(),该函数类似与文件中的 open()操作,可以指定管道的路径和打开的模式。咱们还可以在命令行使用“mknod 管道名 p”来创建有名管道。
. W. @9 i- A' u) j+ }
) C1 h+ G0 H. U 在管道创建成功后,就可以使用open()、write()和read()这些函数了。与普通文件的开发设置一样,对于为读而打开的管道可在open()中设置O_RDONLY,对于为写而打开的管道可在open()中设置O_WRONLY,在这里与普通文件不同的是阻塞问题。由于普通文件在读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以在open()函数中设定为O_NONBLOCK。下面分别对阻塞打开和非阻塞打开的读写进行讨论。
$ [+ }, n, y2 }! u+ ]! n1 W
; l( {2 h5 U5 V. o; G 对于读进程:# L! y0 T: r U1 W
3 U0 y9 T9 b: @3 w
● 若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入。
0 r9 D6 F- U0 L4 p% e: X: R
' n; X3 ~. l" R" D9 t! N( a" Z ● 若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果FIFO内没有数据,则读函数将立刻返回0。
7 c" {: T/ A l" S* V; ? h1 I! b& R1 V Q* t
对于写进程:
3 w/ K% ]: b+ ?. _/ E* Q1 u7 o/ g, M; ~+ ` E. c, Z: N
● 若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。
: R/ L) B, x& z' |1 A! {+ v8 ^7 I0 r, X2 Z" B. W
● 若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。$ f: \7 ~1 G4 ]; T% [; T% w
i* g/ f" P. Y+ v 下表列出了mkfifo()函数的语法要点/ }6 n: J: g- l0 g) i
$ A* i+ }$ S) x* a* u
( x3 Y/ T- [5 t5 ?
( _+ W0 o% a! s# O4 i
0 Z3 C1 J7 H: W1 n' V2 l: r# M
3 @+ ?1 |" L2 A 7 z# L/ Y& c! s' @ @" l R
* L" F5 q6 ~* @" ^1 G9 e3 b; u2 x2 h
3 A6 @$ R1 w" C. s. j
4 k! h% g5 g; N9 z) j
! Q+ v# M, n2 Q( x/ B0 _& I- t
|
|