|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
有名管道(FIFO)
# z1 Y# Z2 A* N9 L2 \' c7 i
; m; s4 `6 R# B) C! T 首先将上一节的有关有名管道的定义再贴出来
. d; |$ N% y7 p H- o5 P5 X* w5 \" Y, |
7 ^1 ^$ P4 u+ ^( v) I 有名管道是对无名管道的一种改进,它具有以下特点:
! N/ n, h8 e( v# |) N' K: @% x! l. ]0 V" u4 F4 d
① 它可以使互不相关的两个进程间实现彼此通信;; i- P# b! d8 U! f- |
6 _8 m3 R' N, j! c2 G
② 该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当做普通文件一样进行读写操作,使用非常方便;
" A4 s3 z3 J# A$ o1 y
- W/ c% e) h" i m/ e t2 j ③ FIFO严格地遵循先进先出规则,对管道及FIFO的读总是从开始处返回数据,对它们的写则是把数据添加到末尾,它们不支持如 lseek()等文件定位操作。, c( a% \7 K8 q- A7 _- @3 y) l
2 }( b- p( K t
有名管道的创建可以使用函数 mkfifo(),该函数类似与文件中的 open()操作,可以指定管道的路径和打开的模式。咱们还可以在命令行使用“mknod 管道名 p”来创建有名管道。/ ]1 r4 k3 h# W. M) v
/ Q* k# T: @* @" ~/ V* t 在管道创建成功后,就可以使用open()、write()和read()这些函数了。与普通文件的开发设置一样,对于为读而打开的管道可在open()中设置O_RDONLY,对于为写而打开的管道可在open()中设置O_WRONLY,在这里与普通文件不同的是阻塞问题。由于普通文件在读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以在open()函数中设定为O_NONBLOCK。下面分别对阻塞打开和非阻塞打开的读写进行讨论。
5 R7 H1 F4 \+ G; |+ A5 _+ T
& R9 o* B/ P9 B8 l+ p) C) T# b 对于读进程:
4 v9 b. n3 l- S4 E
% S: @; H. h! e3 V! L ● 若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入。6 ^ J' m0 \; J; C
; \# j4 j1 Q/ D' E. }7 V) k. \. ^0 Q ● 若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果FIFO内没有数据,则读函数将立刻返回0。
$ M f7 e, ^3 Z( s/ W8 U) O4 s& E* Q) A5 n9 e( C
对于写进程:
* n/ h0 Y d- k1 y; _/ U* W B6 D& `. T# }
● 若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。
" O5 U+ E; u7 I% |; O5 x6 |$ }! C3 Q" Z
● 若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。
" ]- Q* e$ O) f' L9 y
5 _8 i9 X# h' J 下表列出了mkfifo()函数的语法要点
/ U! A: b/ P9 w4 T( z+ {
; C6 U+ v1 ]" p8 Z1 p* I+ [" j
]/ x$ K9 k' l3 ^) R0 i* m
5 p* b7 w, w. k0 W- H0 c6 X0 y4 V% w" X h$ }
& m7 I8 A- E+ b0 ~
8 B- m+ ]) V) Q% g- t% |
& v. N0 a$ t# ~+ l) L8 W& v' V
: r, j* r2 J/ A( V) G; k8 e0 O [
; i) r( q2 d/ Z6 i; t; u* A |
|