目录
进程通信概述
进程用户空间是相互独立的,一般而言是不能相互访问的。但很多情况下进程间需要互相通信,来完成系统的某项功能。进程通过与内核及其它进程之间的互相通信来协调它们的行为。
为什么要通过内核?
原因:进程用户地址空间都是独立的,但内核空间是每个进程共享的,所以进程之间的通信必须通过内核,如下图所示:
进程通信应用场景
(1)数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。
(2)共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。
(3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
(4)资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。
(5)进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
进程通信方式
进程通信方式一般情况下有以下六种:
(1)管道( pipe )
(2)消息队列( message queue )
(3)共享内存( shared memory )
(4)信号量( semophore )
(5)信号 ( sinal )
(6)套接字( socket )
1.管道(pipe)
(1)管道通信概述
管道是针对于本地计算机的两个进程之间的通信而设计的通信方法,建立管道后,实际获得两个文件描述符:一个用于读取而另一个用于写入
注意:
1.管道是单工的,数据只能向一个方向流动,需要双向通信时,需要建立起两个管道
2.数据的读出和写入:
①一个进程向管道中写的内容被管道另一端的进程读出
②写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据
3.管道实际上就是建立在内核区域的一块缓存
4.最常见的 进程间通信(IPC) 机制,通过 pipe 系统调用
(2)匿名管道
匿名管道:简单的说就是没有命名的管道
具有以下特点:
(1)在关系进程中进行(父进程和子进程、兄弟进程之间)
(2)由 pipe 系统调用,管道由父进程建立
(3)管道位于内核空间,其实是一块缓存
以下面指令为例子:
ifconfig | grep -w RX
首先解释以下这个指令各部分的意义
(1)iifconfig:用于配置和显示Linux内核中网络接口的网络参数
(2)grep: 全局正则表达式检索工具(相当于搜索)
(3)-w:grep的参数,作用是只显示全字符合的列
整个命令的解释是:输出ifconfig中RW的列
即:将前⼀个命令( ifconfig)的输出,作为后⼀个命 令( grep -w RX)的输⼊
不难看出,命令行中的“ | ”就是一个管道,并且从功能描述中可以看出管道的传输数据是单向的(单工),如果想相互通信,我们需 要创建两个管道才⾏
同时,上面的这种管道没有名梓,而它就被称为匿名管道,用完后就销毁
(3)命名管道
命名管道:顾名思义就是取了名字的管道
特点:
(1)与匿名管道相反,可以在许多并不相关的进程之间进行通讯
(2)管道位于内核空间,其实是一块缓存
(3)命名管道也被叫做 FIFO ,因为数据是先进先出的传输⽅式
如下例:
mkfifo 20192697 #使用命名管道前,需要使用mkfifo进行管道创建 ls -l #查看
图中黑色标记部分,便是我们刚刚创建的命名管道,20192697 就是这个管道的名称,基于 Linux ⼀切皆⽂件的理念,所以管道也是以⽂件的⽅式存在,我们可以 ⽤ ls -l 看⼀下,这个<