进程间通信提供了进程之间信息传递的方法,提高了进程与进程之间的交互性.
进程间通信的常见方式有以下几种:
- 管道.
- 网络套接字.
- 消息队列.
- 共享内存.
- 信号量.
本篇文章主要浅析后面三种进程间通信的方式.
消息队列
- 什么是消息队列.
首先队列一词肯定会联系到数据结构中的队列结构,其次消息为队列中存放的内容,由此可以得出,消息队列即为存放在队列结构中的一些信息.其次,消息队列更是一个典型的生产者-消费者模型,队头只负责读取,队尾只负责存入数据.取数据一端为消费者,存数据一端为生产者,而队列的存储结构则可以作为一个仓库.消息队列不存在磁盘上,没有文件名. - 消息队列的应用
消息队列主要可用来解决削峰,解耦,异步处理等常见问题.
所谓削峰就是将数据量访问大或某些操作频率过高的时间段通过消息队列进行缓冲,从而将数据量访问数量向后缓冲,成功达到削减一段时间内数据访问量的作用.
所谓解耦就是将两个耦合度较高(相互影响较大)的操作或数据通过消息队列进行缓冲,从而减缓两个操作或数据之间的耦合度,从而使一个操作或数据出现问题而另一个短时间内不受影响,若能在短时间内解决问题,则可达到对另一个数据或操作不产生影响.
消息队列可以将一些操作通过消息队列的缓冲修改为异步操作,提高设备的使用率,提高程序的运行效率. - 消息队列的创建及使用( C )
头文件: #include <sys/ipc.h> #include <sys/msg.h>
int msgget(key_t key, int msgflag);
创建或打开一个消息队列,返回值为队列标识符或失败是返回-1.
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
将一个消息写入消息队列,返回值成功时为0,失败时返回-1.
size_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
从消息队列中读取消息,返回值成功时为实际读取的字节数,失败时为-1.
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
关闭消息队列,返回值为0表示成功关闭,为-1表示关闭失败.
linux中查看已创建的消息队列:
ipcs -q
删除消息队列:
ipcrm -Q共享内存
- 什么是共享内存
共享内存是多个进程访问同一块逻辑内存,是进程间通信的一种方式,与消息队列相比,共享内存使用更加灵活,访问速度也更快. - 共享内存的使用( C )
头文件:
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
创建一个共享内存,成功时返回共享内存标识符,失败时返回-1.
void *shmat(int shmid, const void *shmaddr, int shmflg);
把共享内存区对象映射到调用进程的地址空间,成功时返回共享内存地址,失败时返回-1.
int shmdt(const void *shmaddr);
断开共享内存连接,成功返回0,失败返回-1.
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
共享内存管理,成功返回0,失败返回-1.
- 什么是共享内存
信号量
- 什么是信号量
信号量,有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。 - 信号量的使用
头文件:
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key,int nsems,int semflg);
创建一个信号量集,成功时返回信号量集标识符,失败时返回-1.
int semctl(int semid,int semnum,int cmd, /union semun arg/);
设置信号量初始值,成功时返回一个正数,失败时返回-1.
int semop(int semid,struct sembuf *sops,size_t nsops);
对信号量进行PV操作,成功返回0,失败返回-1.