管道(问题理解)
管道是linux系统最常见的进程间通信方式之一,它在两个进程之间实现一个数据流通的通道,数据以一种数据流的方式在进程间流动。它把一个程序的输出直接连到另一个程序的输入。
解决方案
管道可以分为以下两种,利用这两种管道可以实现进程间的通信,但是对于进程间的关系会有所限制
解决和代码方法如下,数据以字符为例,通信的内容为姓名和学号。
管道分类
(一)无名管道
无名管道属于linux中管道通信的一种原始方法
特点
(1)它只能用于具有亲缘关系的进程之间的通信(即父子进程或兄弟进程之间)
(2)它是一个半双工的通信模式,具有固定的读端和写端
(3)管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read()和write()函数。但是它不是普通的文件,不属于其他任何文件系统,并且只存在于内存中。
实现
代码如上图,fd[0]表示读端,fd[1]表示写端,我们fork()一个子进程,在父进程中将管道的读端关闭,利用write函数写入一串字符后使用wait函数让父进程等待,在子进程中关闭管道的写端,利用read函数读入管道中的字符串然后让其在屏幕输出。
结果如图
(二)有名管道
有名管道是对无名管道的一种改进
特点
(1)它可以使两个互不相关的两个进程实现彼此通信
(2)该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立管道之后,两个进程可以把它当作普通文件一样进行读写操作
(3)有名管道严格遵循先进先出规则,对管道的读总是从开始处返回数据,对于写则是把数据添加到末尾,它们不支持如seek()等文件定位操作
实现
vim fifo_w.c
写端代码
vim fifo_r.c
读端代码
结果
打开终端输入如下
同时打开另一个终端
感想
利用管道实现多进程间的通信属于比较常见的,这个通信的过程还是比较好理解的,比实现生产者和消费者问题要容易一些。