前言
进程是操作系统中独立运行的程序单元,每个进程拥有自己的内存空间。由于进程之间的内存空间是隔离的,不能直接访问彼此的内存,因此需要借助IPC来实现进程间的数据交换
一.管道
进程间通信的本质是让不同的进程看到同一份资源, 我们先来看管道是如何做到的
管道特性
-
- 自带同步机制
- 多用于血缘关系进程进行通信,常见与父子
- pipe是面向字节流的
- 父子退出,管道自动释放,文件的生命周期是随进程的
- 管道只能单向通信
管道的四种情况
- 管道内部没有数据且子进程不关闭自己的写端文件, 读端就要阻塞等待,直到pipe有数据
- 管道内部被写满且读端不关闭自己的fd, 写端写满之后,写端就要阻塞等待
- 对于写端而言:关闭了pipe, 读端会将pipe中的数据读完,最后就会读到返回值为0,表示读结束,类似读到了文件的结尾
- 读端关闭,写端再写,OS会直接终止写入的进程(子进程),通过信号SIGPIPE(13)信号杀掉进程
匿名管道
原理
父进程创建的子进程会继承父进程打开的文件描述符, 让父子进程看到同一个管道文件
然后只需关闭不需要的读写端即可
使用
这个系统调用能让系统维护一个匿名管道, 匿名管道是由操作系统维护的一段缓冲区, 并不会创建文件
pipefd为输出型参数,其本质是一个长度为2
的数组, pipifd[0]表示读端文件描述符, pipefd[1]表示写端文件描述符
返回 0 表示开辟管道成功, 返回 -1 表示开辟管道失败,并且会设置错误码
比如父进程写入管道, 子进程读取管道数据
int main()
{
int fd[2];
pipe(fd);//创建匿名管道
int rfd = fd[0];
int wfd = fd[1];
pid_t id = fork();//创建子进程
if(id == 0)
{
close(wfd);//子进程关闭写文件描述符
//这里就可以执行一些读取管道的方法
exit(0);
}
close(rfd);//父进程关闭读文件描述符
//这里执行一些写入管道的方法
waitpid(id, NULL, 0);
return 0;
}
命名管道
原理
让两个独立的进程打开同一个管道文件
使用
使用mkfifo创建一个命名管道文件
然后就可以让不同的进程打开读写端来完成进程间通信
二.System V
1.共享内存
原理
将一片内存通过页表映射到不同的进程的进程地址空间上
使用
使用ftok获取唯一性标识, 再使用shmget获取共享内存的id
size: 共享内存的大小, 共享内存在内核中以4KB为基本单位
flg常用选项:
- IPC_CREAT:如果共享内存不存在,就创建之,如果共享内存已经存在,直接获取它
- Ipc_EXCL:不能单独使用,没意义
- IPC_CREAT | IPC_EXCL:如果共享内存不存在,就创建之,如果共享内存已经存在,出错返回
控制共享内存
cmd常用选择
- IPC_STAT 获取共享内存的属性
- IPC_RMID 删除指定共享内存
挂接和去关联共享内存
这一步实际就是将共享内存映射到进程的地址空间上
shmat 挂接指定共享内存, 返回一个指针指向共享内存的起始位置
shmid : 共享内存id
shmaddr : 可选指定位置挂接
shmflg常用选项
- 0: 可读可写
- SHM_RDONLY: 只读
shmdt 去关联, 传入已挂接的共享内存起始地址
2.消息队列
原理
一个进程向队列放数据块, 另一个进程拿取
使用
创建一个消息队列
msgflg
常用选项
IPC_CREAT
: 如果指定的key
不存在,则创建一个新的消息队列,如果已经存在,则直接获得原先的消息队列IPC_EXCL
: 如果指定的key
已经存在,则创建失败
控制消息队列
cmd常用选项
IPC_STAT
:获取消息队列的状态信息IPC_SET
:设置消息队列的某些属性IPC_RMID
:删除消息队列
写入操作
msqid:消息队列的标识符
msgp:指向要写入的消息内容的指针
msgsz:要写入内容的字节数
msgflg常用选项
- 0: 默认
- IPC_NOWAIT: 如果消息队列已满,则立即返回
读取操作
msqid:消息队列的标识符
msgp:读到哪个缓冲区
msgsz:缓冲区大小
msgtyp: 指定要接收的消息类型
mesflg常用选项
- 0: 默认
- IPC_NOWAIT: 如果消息队列已满,则立即返回
3.信号量
原理
信号量是一种资源预定机制, 本质是个计数器
进程访问资源前,要先申请一个信号量,用于预定资源,一旦预定成功,不管这个进程使不使用这个资源, 这个资源都不会再被分配给其他进程, 进程只有成功申请到了信号量才能访问这个资源
标签:IPC,文件,队列,间通信,管道,进程,共享内存 From: https://blog.csdn.net/2301_77838258/article/details/141107546