进程间通信方式:管道 信号量 套接字 共享内存 消息队列
#include<sys/types.h> #include<sys/stat.h>
1.打开管道 在内存中分配空间
2.向管道写数据 实际是写到内存中
3.读取 从内存中读
4.大小为0
5.写端关闭 读端read()返回0
读端关闭 写端写入数据产生异常 收到异常信号SIGPIPE
6.管道属于半双工 同一时间内数据只能向一个方向传输
可以在任意两个进程之间通信
int mkfifo(const char* filename,mode_t mode); //管道名 权限
创建: 1. 命令创建: mkfifo
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); //控制共享内存
消息队列是一个消息的链表,有写权限的进程可以向消息队列中添加新消息,有读权限的进程可以从消息队列中独奏消息
int msgget(key_t key,int msqflg);
int msgsnd(int msqid,const void * msqp,size_t msqsz,int msqflg);
ssize_t msqrcv(int msqid,void * msqp,size_t msqsz,long msqtyp,int msqflg );
int msqctl(int msqid,int cmd,struct msqid_ds * buff);