进程间通信方式(一)管道
管道
一.管道分为有名管道和无名管道
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文件,我写的代码如下图,我自己验证了认为正确,如有不同见解忘留言