管道(问题理解)

管道是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
读端代码
利用管道实现多进程间通信
结果
打开终端输入如下
利用管道实现多进程间通信
同时打开另一个终端
利用管道实现多进程间通信

感想

利用管道实现多进程间的通信属于比较常见的,这个通信的过程还是比较好理解的,比实现生产者和消费者问题要容易一些。

相关文章: