EDA365电子论坛网

标题: Linux进程间通信(2)学习一下管道通信之无名管道和他的基础实验 [打印本页]

作者: mytomorrow    时间: 2019-9-24 10:08
标题: Linux进程间通信(2)学习一下管道通信之无名管道和他的基础实验
管道简介
2 ?$ E1 B& a+ O
, F3 a6 c1 I6 N( P" x2 w! h+ s( e   管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入(其实我更愿意将管道比喻为农村浇地的管子)。Linux的管道主要包括两种:无名管道和有名管道。这一节主要讲无名管道,首先介绍一下这两个管道。(特点很重要啊!)4 `+ L9 x% N6 N0 U' L! B

+ |9 n# X. p- T( x1、无名管道
- s% n7 e6 `0 I4 H% h$ o
; ]8 I$ K, `/ t- ~7 |( \9 a% y. r   无名管道是Linux中管道通信的一种原始方法,如图一(左)所示,它具有以下特点:* f. B9 C' v- a

- K, ^) s9 g7 y, f  U+ @1 O   ①  它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间);7 c/ O2 y! O. b0 Z7 c

7 F4 A9 o" `' V5 V   ②  它是一个半双工的通信模式,具有固定的读端和写端;
2 U  q$ a& @. q5 ?$ ]! z6 c1 v
# a( ~1 o) B1 u   ③   管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的 read()、write()等函数。但它不是普通的文件,并不属于其他任何文件系统并且只存在于内存中。, Y" Z& g+ X- J
2 q) c% `( s7 ?& J8 w
2、有名管道(FIFO)
+ \  h$ M5 C9 [( X* l; S
! o% ^6 x% Y* B0 J6 k+ q    有名管道是对无名管道的一种改进,如图1(右)所示,它具有以下特点:
8 [$ L9 x9 g3 q
) r: S. [9 c5 B* \/ f    ①  它可以使互不相关的两个进程间实现彼此通信;* B& b: e! \# R9 A) h) G# {

; ?; D/ Q2 r7 X0 U, F1 l% s# g! W    ②  该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当做普通文件一样进行读写操作,使用非常方便;/ N+ r' T0 E" L1 x0 @5 C% e+ i
. V/ ]& o& [# U
    ③  FIFO严格地遵循先进先出规则,对管道及FIFO的读总是从开始处返回数据,对它们的写则是把数据添加到末尾,它们不支持如 lseek()等文件定位操作。
% N  l9 U: \" ^4 Q4 O# a2 ]/ |: ^# B, R. B8 ^5 `
   

+ `- v0 i. V; V  L5 u( \9 X7 [6 I; D  B2 p  X6 I
无名管道及其系统调用
7 h4 r/ r+ {: B+ O
  }  u, h) F9 V; v) N8 y; S# c1、管道创建与管道说明
) X: U1 q4 q: [2 H( O$ U& S

$ s! g7 V$ r# r: Q- R! ^5 B    管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1],其中fd[0]固定用于读管道,而fd[1]固定用于写管道,如图2所示,这样就构成了一个半双工的通道。* N) F$ Q: U; @; Z# g1 ?% `
! r8 A1 f5 M; F; i# M- W/ H  P& e7 M

8 C# J$ A: F- b# i  _9 t$ P
: |2 f2 Z6 o* n$ a7 `- @4 X8 J+ u" ~) W$ U7 Z9 d/ S7 x& _

作者: onesimus    时间: 2019-9-24 18:05
看看。




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2