本文主要介绍进程间通信(IPC,Inter Process Communication)的一些方式,包括:
包括管道(Pipe)与命名管道(named pipe)。
管道(Pipe),也称匿名管道,是Linux下最常见的进程间通信的方式之一,它是在两个进程之间实现一个数据流通的通道。优点在于简单易用,缺点在于功能简单,有许多限制。
匿名管道在系统中是没有实名的,并不可以在文件系统中以任何方式看到该管道,它只是进程的一种资源,会随着进程的结束而被系统清除。
命名管道(named pipe)也称为FIFO,它是一种文件类型,在文件系统中可以看到它,创建一个FIFO文件类似于创建一个普通文件。
管道应用的一个最大限制在于它没有名字,因而只能用于具有亲缘概关系进程间的通信。而FIFO提供了一个路径名与之关联,以FIFO文件的形式存在于文件系统中,通过路径访问的方式,可以在不相关的进程间通信。
消息队列,也称报文队列,是一种以链表式结构组织的一组数据,存放在内核中,是由各进程通过消息队列标识符来引用的一种数据传送方式。
附:
随进程持续:IPC一直存在,直到打开IPC对象的最后一个进程关闭该对象为止,如管道和有名管道 随内核持续:IPC一直持续到内核重新自举或者显示删除该对象为止,如消息队列、信号量及共享内存等 随文件系统持续:IPC一直持续到显示删除该对象为止
共享内存可以说是Linux下最快速、最有效的进程间通信方式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间,进程A可以及时看到进程B对内存中数据的更新,反之,B也可以看到A的修改。
信号量(Semaphore),也称信号灯,其原理是一种数据操作锁的概念,它本身不具备数据交换的功能,而是通过控制其它的通信资源(文件、外部设备等)来实现进程间通信。
附:PV操作
1962年,荷兰学者Dijksrta在参与X8计算机的开发中设计并实现了具有多道程序运行能力的操作系统——THE Multiprogramming System。为了解决这个操作系统中进程(线程)的同步与互斥问题,他巧妙地利用火车运行控制系统中的“信号灯”(semaphore,或叫“信号量”)概念加以解决。信号量的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,这个信号量的值仅能由PV操作来改变。 PV操作由P操作原语和V操作原语组成(原语也叫原子操作Atomic Operation,是不可中断的过程),PV两个字母是荷兰文 Passeren(通过)和Vrijgeven(释放)的简称,对信号量(注意不要和Windows中的信号量机制相混淆)进行操作,具体定义如下: P(S): ①将信号量S的值减1,即S=S-1; ②如果S>=0,则该进程继续执行;否则该进程置为等待状态。 V(S): ①将信号量S的值加1,即S=S+1; ②该进程继续执行;如果该信号的等待队列中有等待进程就唤醒一等待进程。用PV操作实现多线程的同步与互斥是非常简单的,只要考虑逻辑处理上合理严密而不用考虑具体技术细节。 参考:https://blog.csdn.net/morewindows/article/details/7650470
信号机制是进程之间相互传递消息的一种方法,信号全程为软中断信号,也有人称作软中断。
从它的命名可以看出,它的实质和使用很像中断。注意它和信号量完全不是一个概念。
套接字是操作系统内核的一个数据结构,它是网络中的节点进行相互通信的门户。
套接字也就是网络进程的ID,网络通信,归根到底还是进程间的通信(不同计算机上的进程间通信)。在网络中,每个节点(计算机或路由器)都有一个网络地址,也就是IP地址,但仅凭网络地址还不能确定计算机中的哪个进程,需要端口号(port)来一一对应进程。
参考:
《精通Linux C编程》- 程国钢
https://blog.csdn.net/wh_sjc/article/details/70283843