IPC(进程间通信)机制
2015-08-08 12:14
267 查看
IPC三种通信机制是指:信号量、共享内存、消息队列。
信号量:通过操作系统中的PV操作来实现;
共享内存:申请一块内存,进程A往共享内存中写,其他的进程就可以通过读出共享内存中的内容来获取进程A所传送的信息;
消息队列:创建一个消息队列,进程A往队列里面写,那么进程B通过读队列中的容来获取进程A传送的信息。
具体的实现其实就是用三组函数来实现的,而且形式都是很有相似性的。
信号量:
#include
int semget(key_t key,int num_sems,int sem_flgs);
int semctl(int sem_id,int sem_num,int command...);
int semop(int sem_id,struct sembuf *sem_ops,size_t num_sem_ops);
每个函数的功能和参数的意义在手册中都能找到。
1、semget 创建一个信号量或者获取一个已知信号量的键
key:不相关的进程可以通过他来访问同一个信号量
num_sems:需要的信号量数目。几乎总是1
sem_flags:一组标志,例如IPC_CREAT;
返回值是信号量标志符,给其他信号量函数使用
2、semctl:
sem_id:信号量标志符,semget的返回值
sem_ops:信号量编号,一般取0
command: 就不解释了,在手册中有详细的解释,我就偷偷懒吧。
3、semop
用于改变信号量的值
struct sembuf{
short sen_nums; //信号量编号,一般取0
short sem_op; //一般-1是P操作,1是V操作
short sem_flag; //通常设置为UNDO
}
共享内存
允许两个不像关的进程访问同一个逻辑地址
#include
1、int shmget(key_t key,size_t size,int shmflag);
2、void *shmat(int shm_id,const void *shm_addr,int shm_flag);
3、int shmctl(int shm_id,int cmd,struct shmid_ds *buf);
4、int shmdt(const void *shm_addr);
参数的常用值:
1、shmflag:0666|IPC_CREAT
2、shmaddr=0 shm_flag=0
3、cmd=IPC_SET cmd=IPC_RMID
消息队列:
提供从一个进程向另一个进程发送一个数据块的方法
#include
int msgget(key_t key,int msgflg);
int msgctl(int magid,int cmd,struct msgid_ds *buf);
int msgsnd(int msgid,void *msg_ptr,size_t msg_sz,int msgflag);
int msgrcv(int msgid,void *msg_ptr,size_t msg_sz,long
int msg_type,int msgflag);
信号量:通过操作系统中的PV操作来实现;
共享内存:申请一块内存,进程A往共享内存中写,其他的进程就可以通过读出共享内存中的内容来获取进程A所传送的信息;
消息队列:创建一个消息队列,进程A往队列里面写,那么进程B通过读队列中的容来获取进程A传送的信息。
具体的实现其实就是用三组函数来实现的,而且形式都是很有相似性的。
信号量:
#include
int semget(key_t key,int num_sems,int sem_flgs);
int semctl(int sem_id,int sem_num,int command...);
int semop(int sem_id,struct sembuf *sem_ops,size_t num_sem_ops);
每个函数的功能和参数的意义在手册中都能找到。
1、semget 创建一个信号量或者获取一个已知信号量的键
key:不相关的进程可以通过他来访问同一个信号量
num_sems:需要的信号量数目。几乎总是1
sem_flags:一组标志,例如IPC_CREAT;
返回值是信号量标志符,给其他信号量函数使用
2、semctl:
sem_id:信号量标志符,semget的返回值
sem_ops:信号量编号,一般取0
command: 就不解释了,在手册中有详细的解释,我就偷偷懒吧。
3、semop
用于改变信号量的值
struct sembuf{
short sen_nums; //信号量编号,一般取0
short sem_op; //一般-1是P操作,1是V操作
short sem_flag; //通常设置为UNDO
}
共享内存
允许两个不像关的进程访问同一个逻辑地址
#include
1、int shmget(key_t key,size_t size,int shmflag);
2、void *shmat(int shm_id,const void *shm_addr,int shm_flag);
3、int shmctl(int shm_id,int cmd,struct shmid_ds *buf);
4、int shmdt(const void *shm_addr);
参数的常用值:
1、shmflag:0666|IPC_CREAT
2、shmaddr=0 shm_flag=0
3、cmd=IPC_SET cmd=IPC_RMID
消息队列:
提供从一个进程向另一个进程发送一个数据块的方法
#include
int msgget(key_t key,int msgflg);
int msgctl(int magid,int cmd,struct msgid_ds *buf);
int msgsnd(int msgid,void *msg_ptr,size_t msg_sz,int msgflag);
int msgrcv(int msgid,void *msg_ptr,size_t msg_sz,long
int msg_type,int msgflag);
相关文章推荐
- 设计原则开篇
- 剑指offer刷题之c++实现的求链表中倒数第k个值
- poj2387 Til the Cows Come Home(邻接矩阵,邻接表)
- 小根堆+Kruskal算法
- 对SVM的认识
- Thread01:互斥
- 【DOM操作】实时监听input[type='text']和HTML标签中属性改变事件
- Maven 学习笔记(基本概念)
- Defining a controller with @Controller
- AngularJs学习笔记__4、自定义指令
- 设计-简约而不简单
- ASP.NET中Cookie的用法实例分析
- linux上传下载(scp篇)
- [笔记][Java7并发编程实战手册]2.2使用syncronized实现同步方法
- 配置struts2不当错误
- FZU 2196 Escape(BFS预处理+BFS搜索)
- 机房收费系统颗粒大归仓之----MSFlexGrid控件
- iOS UIView控件的常用属性和方法的总结
- ADT SVN 插件安装教程
- activity切换动画总结