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)。
相关文章: