Linux进程间通信

Linux进程间通信方式包括管道匿名管道命名管道)、信号信号量共享内存消息队列套接字等方式。

1、管道

管道一个进程连接数据流另一个进程通道,它通常被用来把一个进程的输出端连接到另一个进程的输入端。在Linux命令中通常用符号|来表示管道。例如:
$ ps -ef | grep init
此命令中psprocess status)是一个独立的进程grep也是一个独立的进程,中间的管道ps原本要输出到屏幕数据输出到grep中,作为grep这个进程的输入
管道分为匿名管道命名管道两种,匿名管道主要用于两个有父子关系进程间通信命名管道主要用于没有父子关系进程间通信

2、共享内存

共享内存是允许两个不相关进程访问同一个逻辑内存进程间通信方法,是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。两个进程使用共享内存通信机制如图所示:

Linux进程间通信

3、信号量

多进程编程中需要关注进程间同步互斥问题。同步是指多个进程为了完成同一个任务相互协作运行,而互斥是指不同的进程为了争夺有限的系统资源(硬件或软件资源)而相互竞争运行
信号量是用来解决进程间同步与互斥问题的一种进程间通信机制,它是一个特殊的变量,变量的值代表着关联资源的可用数量。若等于0则意味着目前没有可用的资源
根据信号量的值可以将信号量分为二值信号量计数信号量
  • 二值信号量信号量只有01两种值。若资源被锁住,信号量值为0,若资源可用则信号量值为1
  • 计数信号量信号量可在0到一个大于1的数(最大 32767)之间取值。该计数表示可用资源的个数
信号量只能进行两个原子操作P操作V操作
P原子操作V原子操作的具体定义如下:
  • P操作:如果有可用的资源信号量值>0),则占用一个资源将信号量值减1);如果没有可用的资源信号量值=0),则进程阻塞直到系统将资源分配给该进程(进入信号量等待队列,等到资源后再唤醒该进程)。
  • V操作:如果在该信号量等待队列中有进程等待资源,则唤醒一个阻塞进程;如果没有进程等待它,则释放一个资源给信号量值加1)。