进程间通信方式(一)管道

                                                                                                             管道

一.管道分为有名管道和无名管道

1.有名管道:在文件目录树中有一个文件标识,应用于任意两个进程之间数据的单向传递。(linux文件体系创建一个文件标识,但是磁盘上不会开辟空间,数据缓存在内存上,平常内存上也没有空间,只有在使用时在内存上开辟空间)。

创建:命令方式:mkfifo,函数方式mkfifo()

打开:open

写数据:write

读数据:read

关闭:close

2.无名管道:数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。

3.管道为半双工通信

半双工通信:数据流向为单向的。

4.管道通信的原理

注意:进程间通信是多个进程之间数据的交换,进程间通信在内存上进行。

如下图为A进程写数据,B进程进行读数据的过程。

                  

5.有名管道与无名管道的特点

有名管道:

(1)Open阻塞运行Open会阻塞运行,如果只有只读打开或者只有以只写打开的时候,open函数会阻塞,直到一个文件以另一个文件的方式打开文件。(注意write也是一个阻塞函数,当管道写满的时候,则会出现阻塞)

(2)Read读取数据时:如果管道里没有数据,read会阻塞,直到有数据或写端关闭,读端也会返回。<例如代码read.c里在写之前加sleep(10)>.

无名管道:

(1)只能用于具有亲缘关系的进程之间,父子进程,兄弟进程之间通信,因为只有子进程才能继续父进程的文件描述符

(2)基于队列的实现有大小的限制。

有名管道特点验证时用到的主要代码如下:


练习:

1.A进程运行后,从键盘获取数据,通过有名管道传递给B进程,B进程拿到数据后,进行大小写转换,输出到a.txt

代码实现:

A.c:


B.c:


上题如果用无名管道怎么实现呢?

由于为无名管道,所以产生一个.c文件,我写的代码如下图,我自己验证了认为正确,如有不同见解忘留言







































猜你喜欢

转载自blog.csdn.net/shinedays/article/details/78268551