|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
有名管道(FIFO)
& E4 |+ Q4 T/ K; r; a4 y9 y# p# V+ b6 U: A7 K
首先将上一节的有关有名管道的定义再贴出来
& ~" W5 |; M. ~6 {; `8 a' O& e- }8 C+ M: O- b2 {4 u
有名管道是对无名管道的一种改进,它具有以下特点:
3 m. G8 T) g( I4 u; ~5 A0 Y: M, U! y! i p8 {
① 它可以使互不相关的两个进程间实现彼此通信;
! n! ~4 t: q. V9 v' E$ F. A- ?) Q' Q9 D M- h
② 该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当做普通文件一样进行读写操作,使用非常方便;2 [- n- f6 _) [+ I
( ]6 o" S1 n7 y ③ FIFO严格地遵循先进先出规则,对管道及FIFO的读总是从开始处返回数据,对它们的写则是把数据添加到末尾,它们不支持如 lseek()等文件定位操作。
: _$ K$ o8 u P$ }$ \4 y# J8 H+ {9 f% Y* R, W
有名管道的创建可以使用函数 mkfifo(),该函数类似与文件中的 open()操作,可以指定管道的路径和打开的模式。咱们还可以在命令行使用“mknod 管道名 p”来创建有名管道。
; Q/ [' d2 ?; J8 l9 N9 s" M* N9 F% m" e# t8 n* r
在管道创建成功后,就可以使用open()、write()和read()这些函数了。与普通文件的开发设置一样,对于为读而打开的管道可在open()中设置O_RDONLY,对于为写而打开的管道可在open()中设置O_WRONLY,在这里与普通文件不同的是阻塞问题。由于普通文件在读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以在open()函数中设定为O_NONBLOCK。下面分别对阻塞打开和非阻塞打开的读写进行讨论。
" Z; l6 I* i! y: h/ n
6 y; F4 z5 ?1 x 对于读进程:
) |0 @: D3 i3 g% B8 [7 W7 f
# p m* t) ~. }4 Q ● 若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入。6 f1 t# n2 M z) S5 u* {
% a$ [2 f y. c: a0 {9 Y ● 若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果FIFO内没有数据,则读函数将立刻返回0。
$ X2 A& W) X% J+ l5 J* Z
$ z0 G3 }, K! V6 P 对于写进程:
1 Z# Y- K5 G" s2 |) X1 j# Y) E0 W! T9 B9 `
● 若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。
7 g z: ]2 ?8 u" N n$ o& a# b$ B' @$ f7 h
● 若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。6 P" K% w' q! s& U! F; c( Y+ u
1 |: k- G; T- w; F2 F
下表列出了mkfifo()函数的语法要点: A# \0 q2 w. C- N9 Z' g
X# V6 E9 y& j) e4 }- B3 E
; b6 j- _/ G' _. i
5 N* {8 u/ O. y/ n; ]9 w, W) N q2 X' Y
$ y) }8 [" v# s, L7 Y! o3 v* X 6 `/ `4 N- S; i; k! P- t
( E, k+ N: j" g' q. E0 ]: y! {9 F
\/ ~# }6 y2 b V6 u- x6 P% R$ ] ` C
+ f. l$ S/ {* {7 D9 ~0 g |
|