|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
有名管道(FIFO)4 k S1 { @- l" {/ P
* q$ L! f0 } c8 I, m 首先将上一节的有关有名管道的定义再贴出来! A5 d( m6 Z9 u0 h Y, g
, s/ q5 P( k: H: z- B ?0 f. e+ v. { 有名管道是对无名管道的一种改进,它具有以下特点:
( f S7 }" t$ r" O) s- u P0 _; J+ h1 P
① 它可以使互不相关的两个进程间实现彼此通信;5 k1 \, {$ S6 C$ d
0 T/ y7 l& I& o4 ~. ?. x ② 该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当做普通文件一样进行读写操作,使用非常方便;, l$ N& S4 b1 y% |
6 b8 E* X, N# s9 @) g7 {8 _ ③ FIFO严格地遵循先进先出规则,对管道及FIFO的读总是从开始处返回数据,对它们的写则是把数据添加到末尾,它们不支持如 lseek()等文件定位操作。
$ o5 o" k/ K2 R0 ~6 P4 g4 n) x/ X! O0 ^' P
有名管道的创建可以使用函数 mkfifo(),该函数类似与文件中的 open()操作,可以指定管道的路径和打开的模式。咱们还可以在命令行使用“mknod 管道名 p”来创建有名管道。
$ s( e, `+ l1 U! O/ k- m4 q4 c4 }0 U1 V4 X0 f2 Z. p/ K
在管道创建成功后,就可以使用open()、write()和read()这些函数了。与普通文件的开发设置一样,对于为读而打开的管道可在open()中设置O_RDONLY,对于为写而打开的管道可在open()中设置O_WRONLY,在这里与普通文件不同的是阻塞问题。由于普通文件在读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以在open()函数中设定为O_NONBLOCK。下面分别对阻塞打开和非阻塞打开的读写进行讨论。
_* N! v4 c7 Z4 X- D* ^
( P8 O0 J8 j/ X 对于读进程:9 x( P4 K# ?% m a8 c3 ~ H! z
: W. Z, s, B7 z! j- l$ r5 _1 g0 s$ J
● 若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入。- I2 w0 T) L3 x8 A5 c
8 p5 E9 X6 R6 V G; r: p ● 若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果FIFO内没有数据,则读函数将立刻返回0。( Q& i" z" O. z8 O/ z8 T% j" _, b
1 T t8 ~* K5 {* v 对于写进程:0 P! H0 Z) Z. t6 C6 u* X/ K# g
! Q/ c- A3 a9 L: m! L. q( Q8 F
● 若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。
9 R9 r2 i, H* U
( Z. N; ?/ m9 Y5 F& u& q ● 若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。
3 m0 p. H Q1 `/ A3 c. J2 D) X3 a8 l/ d* Z0 `( I
下表列出了mkfifo()函数的语法要点
' f, o$ o( n' k* C( n& u8 i# ?# C0 C# G1 t! o' g7 Z. ?- e2 n. s
. o+ ^8 `1 u2 B, G6 C& y2 l
* l6 c; y9 x) Y6 c; {' {# S( X; r* Z- I2 s" o( e& h3 w
0 l1 m; p3 `7 u & i5 T. I3 [- j0 Q0 B
0 V$ T% d# ?& n% p! D/ O- X1 R
) s% @- N/ j9 F3 X8 [/ e; r9 ]5 `# o! _0 t0 E
: k# L b+ A/ b; p |
|