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

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

[复制链接]

该用户从未签到

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

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 ]" p
游客,如果您要查看本帖隐藏内容请回复
8 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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-24 00:40 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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