在系统中,随着我们的进程越来越多,难免不同进程之间要互相传输一些数据,那么这个时候该怎么办呢?
下面主要简单了解一下,进程间通信(InterProcess Communication,IPC)的几种实现方式!
1、管道模型
管道模型与软件生命周期模型——瀑布模型(Waterfall Model)很相似。
所谓的瀑布模型,其实就是将整个软件开发过程分成多个阶段,往往是上一个阶段完全做完,才将输出结果交给下一个阶段。
还记得咱们最初学 Linux 命令的时候,有下面这样一行命令:
ps -ef | grep 关键字 | awk '{print $2}' | xargs kill -9
这里面的竖线“|”就是一个管道。它会将前一个命令的输出,作为后一个命令的输入。
从管道的这个名称可以看出来,管道是一种单向传输数据的机制,它其实是一段缓存,里面的数据只能从一端写入,从另一端读出。如果想互相通信,我们需要创建两个管道才行。
管道又可以分为匿名管道和命名管道!
1.1 匿名管道
如上命令:
ps -ef | grep 关键字 | awk '{print $2}' | xargs kill -9
匿名管道:用"|” 表示的管道,意思就是这个类型的管道没有名字,用完了就销毁了。竖线代表的管道随着命令的执行自动创建、自动销毁。用户甚至都不知道自己在用管道这种技术,就已经解决了问题。
1.2 命名管道
命名管道,这个类型的管道需要通过mkfifo
命令显式地创建。
mkfifo donge#建立一个管道
donge
就是这个管道的名称。管道以文件的形式存在,这也符合 Linux 里面一切皆文件的原则。
下面我们看一下文件类型
ls -l
prw-rw-r-- 1 dong dong 0 Sep 28 17:09 donge
可以看到,这个文件的类型是p
,就是pipe
的意思。
往管道中写入数据
echo "hello world" > donge
这个时候,管道里面的内容没有被读出,这个命令就是停在这里的,即进程被堵塞。
这说明当一个项目组要把它的输出交接给另一个项目组做输入,当没有交接完毕的时候,前一个项目组是不能撒手不管的。
重新打开一个终端,读出管道数据
cat < hello
hello world
一方面,我们能够看到,管道里面的内容被读取出来,打印到了终端上;
另一方面,echo 那个命令正常退出了,也即交接完毕,前一个项目组就完成了使命,可以解散了。
管道通信,我们可以看出,瀑布模型的开发流程效率比较低下,因为团队之间无法频繁地沟通。而且,管道的使用模式,也不适合进程间频繁的交换数据。