|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
有名管道(FIFO)4 C# Y9 j- X5 S0 |# e! b8 F5 w- h" V R& {
: Y1 E; t O2 a' {( f2 b4 a 首先将上一节的有关有名管道的定义再贴出来" s! Z! O. c% T
K& S: K4 g/ v" @' z
有名管道是对无名管道的一种改进,它具有以下特点:4 h8 P7 a1 a( B E
9 E0 R! T4 A% ?& G& M# S Q$ Z e5 ?
① 它可以使互不相关的两个进程间实现彼此通信;
6 P4 C& l5 h- m( G* a
# _/ P; ?; `' b$ w8 @8 S ② 该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当做普通文件一样进行读写操作,使用非常方便;
5 ~% e' I" G& X4 N0 E3 O# ]2 e' s
5 ~! E; H7 P7 P% |8 R ③ FIFO严格地遵循先进先出规则,对管道及FIFO的读总是从开始处返回数据,对它们的写则是把数据添加到末尾,它们不支持如 lseek()等文件定位操作。
\& Q0 I$ A1 B7 v5 V7 B. P! I q9 g A/ I0 P, M
有名管道的创建可以使用函数 mkfifo(),该函数类似与文件中的 open()操作,可以指定管道的路径和打开的模式。咱们还可以在命令行使用“mknod 管道名 p”来创建有名管道。: u5 u) ?( E5 o1 X c
0 u) @+ R* F- u6 l E& k, O% B 在管道创建成功后,就可以使用open()、write()和read()这些函数了。与普通文件的开发设置一样,对于为读而打开的管道可在open()中设置O_RDONLY,对于为写而打开的管道可在open()中设置O_WRONLY,在这里与普通文件不同的是阻塞问题。由于普通文件在读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以在open()函数中设定为O_NONBLOCK。下面分别对阻塞打开和非阻塞打开的读写进行讨论。
. _2 R& j9 Y" y* o/ W7 D( v
4 }; _- R8 k! k- U1 Q 对于读进程:7 J# ~. o& d! o6 D. L
# u/ S$ M/ l& [
● 若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入。5 X* R3 |+ a) q. p, ^( Q8 m5 `: x
! G+ o( V1 _2 Y4 E( {
● 若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果FIFO内没有数据,则读函数将立刻返回0。# G9 y( |7 H3 m' D( \/ C
g2 T6 G1 G9 d' g M2 ?2 X
对于写进程:( b; \: g0 O6 ^
2 l5 J& y& L* ~
● 若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。0 _( V b& M. @) o
- L) X4 S) H2 T1 l# m
● 若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。
% w }( K5 H; d7 e9 w* H3 d, B2 B2 ~* p+ W/ L6 F
下表列出了mkfifo()函数的语法要点
! Y# D) P: s( a: A- r5 O6 ]( S( E% q3 ^; J( q! d& u
3 R" N: `( O; k4 _1 O
3 H, |$ B* f* e3 C( N k
7 [# ~ Y# c. m/ c! a6 u
: u8 _6 g! u5 p0 \6 i( { # S5 W: P% m' n9 ~) V/ \
$ H: g, R; n( \. O: {4 a
' l2 h* v8 |& ?2 v
`( |) Z+ N! u3 r+ @! v# r) d! r$ Q' R8 l& O- _
|
|