进程间通信
文章目录
本文主要记录一些进程间通信方法。
信号/signal
可以给其他进程发送信号(可附带数据)通知对方。
常见的信号如SIGINT、SIGTERM等是操作系统给进程发送的。
一般用作通信的主要是用户自定义信号SIGUSR1
和SIGUSR2
。
具体使用参考sigaction
的说明。
信号量
信号量主要用来同步共享资源的访问。
互斥锁
互斥锁mutex是独占式的锁,加锁之后任意进程试图加锁都将阻塞(直到锁被释放)。
通过初始状态是锁住的互斥锁,一个进程释放,另一个进程加锁,可以达到通知的作用。
条件变量
条件变量一般配合互斥锁使用,可以实现更灵活的通知。
在不满足条件时,进程将阻塞等待。在满足条件后,可选择通知一个或全部等待中的进程。
比较适合类似生产者消费者的场景。
管道
匿名管道
适用于有亲缘关系进程间的半双工通信,一端写,一端读。
命名管道
类似于匿名管道,通过名字(也可以理解为路径)即可访问,进程间不要求亲缘关系。
具体使用参考mkfifo
的说明。
socket
socket可以用于不同机器之间的网络通信,当然也可以用于本机内部的通信。
本地socket正是这样一种适用于进程间通信的socket。
环回socket(127.0.0.1地址)也可以,速度和吞吐量差一些。
本地socket
本地socket,也叫 unix domain socket
,是一种开源库广泛使用的进程间通信方式,比如说dbus、libuv。
创建socket时指定AF_UNIX
以及路径即可,后续跟普通socket操作类似。
消息队列
基于消息的通信方式,可以根据不同的消息类型以及优先级来处理。
有POSIX和System V两套接口,根据系统以及业务场景选用即可。
共享内存
高效的进程间通信方式(减少了数据拷贝),通常需要配合信号量或者其他同步机制使用。
具体参考 共享内存使用 的说明。