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

信号/signal

可以给其他进程发送信号(可附带数据)通知对方。
常见的信号如SIGINT、SIGTERM等是操作系统给进程发送的。
一般用作通信的主要是用户自定义信号SIGUSR1SIGUSR2
具体使用参考sigaction的说明。

信号量

信号量主要用来同步共享资源的访问。

互斥锁

互斥锁mutex是独占式的锁,加锁之后任意进程试图加锁都将阻塞(直到锁被释放)。
通过初始状态是锁住的互斥锁,一个进程释放,另一个进程加锁,可以达到通知的作用。

条件变量

条件变量一般配合互斥锁使用,可以实现更灵活的通知。
在不满足条件时,进程将阻塞等待。在满足条件后,可选择通知一个或全部等待中的进程。
比较适合类似生产者消费者的场景。

管道

匿名管道

适用于有亲缘关系进程间的半双工通信,一端写,一端读。

命名管道

类似于匿名管道,通过名字(也可以理解为路径)即可访问,进程间不要求亲缘关系。
具体使用参考mkfifo的说明。

socket

socket可以用于不同机器之间的网络通信,当然也可以用于本机内部的通信。
本地socket正是这样一种适用于进程间通信的socket。

本地socket

本地socket,也叫 unix domain socket ,是一种开源库广泛使用的进程间通信方式,比如说dbus、libuv。
创建socket时指定AF_UNIX以及路径即可,后续跟普通socket操作类似。

消息队列

基于消息的通信方式,可以根据不同的消息类型以及优先级来处理。
有POSIX和System V两套接口,根据系统以及业务场景选用即可。

共享内存

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