找回密码
 注册
关于网站域名变更的通知
查看: 269|回复: 1
打印 上一主题 下一主题

Linux进程间通信(3)这篇讲的是管道通信之有名管道和他的基础实验

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-9-24 10:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
有名管道(FIFO)
& E4 |+ Q4 T/ K; r; a4 y9 y# p# V+ b6 U: A7 K
   首先将上一节的有关有名管道的定义再贴出来
& ~" W5 |; M. ~6 {; `8 a' O& e- }8 C+ M: O- b2 {4 u
    有名管道是对无名管道的一种改进,它具有以下特点:
3 m. G8 T) g( I4 u; ~5 A0 Y: M, U! y! i  p8 {
    ①  它可以使互不相关的两个进程间实现彼此通信;
! n! ~4 t: q. V9 v' E$ F. A- ?) Q' Q9 D  M- h
    ②  该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当做普通文件一样进行读写操作,使用非常方便;2 [- n- f6 _) [+ I

( ]6 o" S1 n7 y    ③  FIFO严格地遵循先进先出规则,对管道及FIFO的读总是从开始处返回数据,对它们的写则是把数据添加到末尾,它们不支持如 lseek()等文件定位操作。
: _$ K$ o8 u  P$ }$ \4 y# J8 H+ {9 f% Y* R, W
     有名管道的创建可以使用函数 mkfifo(),该函数类似与文件中的 open()操作,可以指定管道的路径和打开的模式。咱们还可以在命令行使用“mknod 管道名 p”来创建有名管道。
; Q/ [' d2 ?; J8 l9 N9 s" M* N9 F% m" e# t8 n* r
     在管道创建成功后,就可以使用open()、write()和read()这些函数了。与普通文件的开发设置一样,对于为读而打开的管道可在open()中设置O_RDONLY,对于为写而打开的管道可在open()中设置O_WRONLY,在这里与普通文件不同的是阻塞问题。由于普通文件在读写时不会出现阻塞问题,而在管道的读写中却有阻塞的可能,这里的非阻塞标志可以在open()函数中设定为O_NONBLOCK。下面分别对阻塞打开和非阻塞打开的读写进行讨论。
" Z; l6 I* i! y: h/ n
6 y; F4 z5 ?1 x     对于读进程:
) |0 @: D3 i3 g% B8 [7 W7 f
# p  m* t) ~. }4 Q    ●  若该管道是阻塞打开,且当前FIFO内没有数据,则对读进程而言将一直阻塞到有数据写入。6 f1 t# n2 M  z) S5 u* {

% a$ [2 f  y. c: a0 {9 Y    ●  若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程都会立即执行读操作。即如果FIFO内没有数据,则读函数将立刻返回0。
$ X2 A& W) X% J+ l5 J* Z
$ z0 G3 }, K! V6 P    对于写进程:
1 Z# Y- K5 G" s2 |) X1 j# Y) E0 W! T9 B9 `
    ●  若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入。
7 g  z: ]2 ?8 u" N  n$ o& a# b$ B' @$ f7 h
    ●  若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入或者调用失败。6 P" K% w' q! s& U! F; c( Y+ u
1 |: k- G; T- w; F2 F
   下表列出了mkfifo()函数的语法要点: A# \0 q2 w. C- N9 Z' g
  X# V6 E9 y& j) e4 }- B3 E
游客,如果您要查看本帖隐藏内容请回复

; b6 j- _/ G' _. i
5 N* {8 u/ O. y/ n; ]9 w, W) N  q2 X' Y

$ y) }8 [" v# s, L7 Y! o3 v* X 6 `/ `4 N- S; i; k! P- t
( E, k+ N: j" g' q. E0 ]: y! {9 F

  \/ ~# }6 y2 b  V6 u- x6 P% R$ ]  `  C

+ f. l$ S/ {* {7 D9 ~0 g

该用户从未签到

2#
发表于 2019-9-24 18:05 | 只看该作者
谢谢楼主分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 00:27 , Processed in 0.171875 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表