Linux进程间通信
分类:
文章
•
2023-03-19 16:32:02
Linux进程间通信
方式包括管道
(匿名管道
和命名管道
)、信号
、信号量
、共享内存
、消息队列
和套接字
等方式。
1、管道
管道
是一个进程
连接数据流
到另一个进程
的通道
,它通常被用来把一个进程的输出端
连接到另一个进程的输入端
。在Linux命令
中通常用符号|
来表示管道
。例如:
$ ps -ef | grep init
此命令中ps
(process status
)是一个独立的进程
,grep
也是一个独立的进程
,中间的管道
把ps
原本要输出到屏幕
的数据
输出到grep
中,作为grep
这个进程的输入
。
管道
分为匿名管道
和命名管道
两种,匿名管道
主要用于两个有父子关系
的进程间通信
,命名管道
主要用于没有父子关系
的进程间通信
。
2、共享内存
共享内存
是允许两个不相关
的进程
访问同一个逻辑内存
的进程间通信方法
,是在两个正在运行的进程
之间共享和传递数据
的一种非常有效的方式。两个进程使用共享内存
的通信机制
如图所示:
3、信号量
多进程编程
中需要关注进程间
的同步
及互斥
问题。同步
是指多个进程为了完成同一个任务
相互协作运行
,而互斥
是指不同的进程为了争夺有限的系统资源
(硬件或软件资源)而相互竞争运行
。
信号量
是用来解决进程间同步与互斥
问题的一种进程间通信机制
,它是一个特殊的变量,变量的值代表着关联资源的可用数量
。若等于0
则意味着目前没有可用的资源
。
根据信号量的值
可以将信号量
分为二值信号量
和计数信号量
:
二值信号量
:信号量
只有0
和1
两种值。若资源被锁住,信号量值为0
,若资源可用则信号量值为1
;
计数信号量
:信号量
可在0
到一个大于1的数
(最大 32767
)之间取值。该计数表示可用资源的个数
。
信号量
只能进行两个原子操作
:P操作
、V操作
。
P原子操作
和V原子操作
的具体定义如下:
P操作
:如果有可用的资源
(信号量值>0
),则占用一个资源
(将信号量值减1
);如果没有可用的资源
(信号量值=0
),则进程
被阻塞
直到系统将资源分配
给该进程(进入信号量
的等待队列
,等到资源后再唤醒
该进程)。
V操作
:如果在该信号量
的等待队列
中有进程
在等待资源
,则唤醒
一个阻塞进程
;如果没有进程等待它,则释放一个资源
(给信号量值加1
)。