进程间通信
进程是操作系统提供给上层的虚拟容器,为程序运行提供隔离和保护。容器之间需要交互,交互方式由操作系统提供相应的系统调用实现。
基于内存的通信
信号
csigprocmask()
- 信号是一种软件软中断机制
- 为进程提供响应外界发送单向数据的机制
- 进程可以实现对特定信号的响应逻辑
- 类似于事件的概念
- 信号的回调函数是异步的,最好是可重入的
信号处理流程:
- 信号发送:操作系统生成信号并发送给目标进程
- 信号接收和处理:进程接收信号,执行信号处理程序
- 默认行为:
- 终止进程(如SIGKILL、SIGTERM)
- 暂停进程(如SIGSTOP)
- 忽略信号(如SIGCHLD)
- 继续执行(如SIGCONT)
管道
cpipe() mkfifo()
- 单向管道(匿名管道):主要用于父子进程间通信,数据流是单向的
- 双向管道(命名管道):支持无父子关系的进程间通信
消息队列
cmsgget() msgsnd() msgrcv()
- 在内核中维护的队列,用于存储进程间交换的消息
- 支持消息的异步传输
- 消息在队列中按顺序排列
- 支持优先级
- 提供良好的可靠性和同步机制
信号量(Semaphore)
- 用于控制多个进程对共享资源访问的同步机制
- 用于进程间的互斥和同步
- 类型:
- 二值信号量(互斥锁):值只有0和1
- 计数信号量:值可以是非负整数,表示资源剩余数量
共享内存
cshm_open()
- 多个进程可以同时访问共享内存
- 通常需要使用互斥量或信号量进行同步
- 适合大量、快速的进程间数据共享
基于文件的通信
套接字(Socket)
- 满足跨主机的通信
- 特别适合通过网络或专用线路通信
eventfd
- 用于进程或线程间通信
- 支持用户态和内核态之间通信
磁盘文件