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( s9 `# 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