本文主要记录一些进程间通信方法。

信号/signal

可以给其他进程发送信号(可附带数据)通知对方。
常见的信号如SIGINT、SIGTERM等是操作系统给进程发送的。
一般用作通信的主要是用户自定义信号SIGUSR1SIGUSR2
具体使用参考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两套接口,根据系统以及业务场景选用即可。

共享内存

高效的进程间通信方式(减少了数据拷贝),通常需要配合信号量或者其他同步机制使用。
具体参考 共享内存使用 的说明。