linux进程间一共有六种通信方式:
1.管道:无名管道(pipe)和有名管道(FIFO)
2.信号(signal)
3.信号量(Semaphore)
4.消息队列(MessageQueue)
5.共享内存(shared memory)
6.套接字(socket)
1.管道:
管道分为无名管道(pipe)和有名管道(fifo)。
无名管道是一种半双工的通信方式,数据只能往一个方向流动,且只能在有亲缘关系的进程之间使用,进程间的亲缘关系一般是指父子进程;
有名管道也是一种半双工的通信方式,可以再没有亲缘关系的进程之间通信;
有名管道和无名管道的主要区别在于,命名管道有一个名字,命名管道的名字对应于一个磁盘索引节点,有了这个文件名,任何进程有相应的权限都可以对它进行访问。
2.信号(signal):
信号是Linux系统中用于进程之间通信或操作的一种机制,处理异步事件,是异步通信方式。信号主要有两个来源:
1)硬件来源;
2)软件来源,例如使用系统调用或者命令发出信号。
主要作为进程间以及同一进程不同线程之间的同步手段。
信号的机制参考:https://blog.csdn.net/gatieme/article/details/50990456
3.信号量(Semaphore):
信号量是一种计数手段,可以用来控制多个进程对共享资源的访问。经常作为一种锁机制,防止一个进程在访问共享资源时,有其他的进程也来访问该资源。因此作为进程间以及统一进程不同线程之间的同步手段。
4.消息队列(MessageQueue):
由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点
5.共享内存(shared memory)
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
6.套接字( socket )
套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信
更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。