EDA365电子论坛网
标题:
Linux进程间通信(3)这篇讲的是管道通信之有名管道和他的基础实验
[打印本页]
作者:
mytomorrow
时间:
2019-9-24 10:14
标题:
Linux进程间通信(3)这篇讲的是管道通信之有名管道和他的基础实验
有名管道(FIFO)
& L- ]9 Z* C3 M
( `! x( I2 E+ R& v' q6 C5 }
首先将上一节的有关有名管道的定义再贴出来
% A+ B# ~) T* p8 ~: [ W# M1 `
# j. F+ v! E9 m( s. ^7 q9 Z7 b3 u
有名管道是对无名管道的一种改进,它具有以下特点:
& o5 c a4 V3 j- X( s
9 `# s7 }8 z" V9 A! S7 _
① 它可以使互不相关的两个进程间实现彼此通信;
4 E( m7 ?4 B* V+ r
$ k8 _& L! _1 [
② 该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当做普通文件一样进行读写操作,使用非常方便;
8 N+ l( c9 Q3 ^
% s, r7 L* I1 n* c
③ FIFO严格地遵循先进先出规则,对管道及FIFO的读总是从开始处返回数据,对它们的写则是把数据添加到末尾,它们不支持如 lseek()等文件定位操作。
0 K: P$ c/ K7 U/ N* n0 }7 J
/ x! N) d+ R6 A; f
有名管道的创建可以使用函数 mkfifo(),该函数类似与文件中的 open()操作,可以指定管道的路径和打开的模式。咱们还可以在命令行使用“mknod 管道名 p”来创建有名管道。
* `5 ^7 _+ I2 o' j8 q
! E% S9 j( k" w O1 r& ]+ f
在管道创建成功后,就可以使用open()、write()和read()这些函数了。与普通文件的开发设置一样,对于为读而打开的管道可在open()中设置O_RDONLY,对于为写而打开的管道可在open()中设置O_WRONLY,在这里与普通文件不同的是阻塞问题。由于普通文件在读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以在open()函数中设定为O_NONBLOCK。下面分别对阻塞打开和非阻塞打开的读写进行讨论。
# Z6 x: y5 a- q9 Z
( B2 p* ^& A j
对于读进程:
5 S* ]+ D( g' f% G6 I0 D" R
; a# j- h2 L2 v! W5 y" U$ j+ j
● 若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入。
4 n5 S7 D3 J$ y& O3 d+ W1 C
& y# M1 m% o( K$ a3 d" ~/ p- G
● 若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果FIFO内没有数据,则读函数将立刻返回0。
" w% }* _9 ` L9 o' ^ A! ]+ v
' D7 j, [/ R& a1 c6 G
对于写进程:
0 ]9 p8 G: K, y
( n; N y$ r! x' Z/ Q: J
● 若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。
1 f. [% y, e1 _. k/ e1 r9 H
* m0 P) e/ I# `7 q' u q
● 若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。
6 J4 B* g& i; ^' e& U
! X o. S C n; J
下表列出了mkfifo()函数的语法要点
6 y/ x4 d, J- Q: z. v, K- q0 [1 \% e
9 k+ x2 K/ g7 n* A: V
7 w7 f( u8 [2 m7 L3 I8 ?
/ O9 ?- o( l! {+ O3 U$ D1 S, o
9 F2 u; X0 O: J" ?& o4 C, ~5 u1 ?
$ q$ ^" Y) P6 c1 t. y6 c
" O6 w2 [/ B- t
4 ~1 ]4 V. w( I6 R4 L! K8 w( F
% p- Z2 G- K0 Q4 U
" w7 O0 ^: J+ I$ B8 s" F6 {
/ K* l; g J2 r! I
作者:
Demyar
时间:
2019-9-24 18:05
谢谢楼主分享。
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2