进程间通信
1. 概述
Linux进程通信手段基本上是从Unix平台上继承的。
- 最初的Unix IPC:管道、信号
- System V IPC
- 消息队列、信号量、共享内存区
- The Portable Operating System Interface (POSIX)
- 基于Socket IPC
总结下,Linux进程通信有如下方式:
- 管道(pipe)和有名管道
- 信号(signal)
- 消息队列
- 共享内存
- 信号量
- 套接字(socket)
2. 管道
(1)普通管道
关于管道:
- 管道由内核管理的一个缓冲区,环形结构
- 管道特点:单向的、先进先出的、无结构的、固定大小的字节流
- 当父进程与使用fork创建的子进程直接通信时,发送数据的进程关闭读端,接受数据的进程关闭写端
管道局限性:
- 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)
(2)命名管道
命名管道,也叫FIFO文件,是一种特殊类型的文件
0 prw-r--r-- 1 sparkandshine wheel 0 May 24 11:23 myfifo
用函数mkfifo创建命名管道,
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);
mode: O_RDONLY, O_WRONLY, O_RDWR, …
管道读写,跟普通文件读写API一样,read
和write
。