文章目录
进程间通信
进程间通信方式:管道 信号量 套接字 共享内存 消息队列
管道
#include<sys/types.h>
#include<sys/stat.h>
1.打开管道 在内存中分配空间
2.向管道写数据 实际是写到内存中
3.读取 从内存中读
4.大小为0
5.写端关闭 读端read()返回0
读端关闭 写端写入数据产生异常 收到异常信号SIGPIPE
6.管道属于半双工 同一时间内数据只能向一个方向传输
1. 有名管道
可以在任意两个进程之间通信
int mkfifo(const char* filename,mode_t mode); //管道名 权限
创建: 1. 命令创建: mkfifo
2. 系统调用创建
2. 无名管道
主要是用于在父子进程之间通信
int pipe(int fd[2]);//成功返回0 失败返回-1
fd[0] //管道读端描述符
fd[1] //管道写端描述符
信号量
信号量一般取正数值,它的值代表允许访问的资源数目,信号量主要用于同步进程
获取资源时,需要对信号量的值进行原子减一,P操作,当信号量值为0时,代表没有资源可用,P操作会阻塞
释放资源时,需要对信号量的值进行原子加一,V操作,
信号量的值如果只取0,1,将其称为二值信号量
信号量的值大于1,称之为计数信号量
临界资源:同一时刻,只允许被一个进程或线程访问的资源
临界区:访问临界资源的代码段
共享内存
为多个进程之间共享和传递数据提供了一种有效方式
原理
- 先在物理内存上申请一块空间
- 多个进程可以将其映射到自己的虚拟地址空间中,所有进程都可以访问共享内存中的地址
- 如果某个进程向共享内存写入了数据,所做的改动会立刻被可以访问同一段共享内存的任何其他进程看到
有关函数
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
int shmget(key_t key,size_t size,int shmfig);
//成功返回共享内存的ID,失败返回-1
int shmdt(const void * shmaddr);
//断开当前进程的shmaddr指向 的共享内存映射
int shmctl(int shmid,int cmd,struct shmid_ds * buff);
//控制共享内存
消息队列
消息队列是一个消息的链表,有写权限的进程可以向消息队列中添加新消息,有读权限的进程可以从消息队列中独奏消息
相关函数
- 创建或获取一个消息队列
msqflg : IPC_CREAT
int msgget(key_t key,int msqflg);
- 发送一条消息,成功返回0,失败返回-1
msqsz:指定mtext中有效数据的长度
msqflg:一般设置为0 IPC_NOWAIT
int msgsnd(int msqid,const void * msqp,size_t msqsz,int msqflg);
- 接收一条消息,成功返回mtext中接收到的数据长度,失败返回-1
msqtyp:指定接收的消息类型 0
msqflg:一般设置为0 IPC_NOWAIT
ssize_t msqrcv(int msqid,void * msqp,size_t msqsz,long msqtyp,int msqflg
);
- 控制消息队列,成功返回0
cmd:IPC_RMID
int msqctl(int msqid,int cmd,struct msqid_ds * buff);