UNIX C XSI_IPC对象、共享内存
1.创建IPC对象
#include <sys/ipc.h> key_t ftok(const char* pathname,int proj_id); 成功返回可用于创建或获取IPC的键,失败则返回-
2.创建、获取共享内存
#include <sys/shm.h> int shmget(key_t key,size_t size,int shmflg); 成功返回共享内存标志符,失败返回- --key:共享内存键
--size:共享内存大小
--shmflg:创建标志,可取以下值
-获取,不存在即失败
IPC_CREAT -创建,不存在即创建,已存在即获取
IPC_EXCL -排斥,已存在即失败
3.加载共享内存
#include <sys/shm.h>
void* shmat(int shmid,const void* shmaddr,int shmflg);
成功返回共享内存起始地址,失败返回-
--shmid:共享内存标志符
--shmaddr:指定映射地址,可置NULL,由系统自动选择
--shmflg:加载标志
-以读写方式使用共享内存
SHM_RDONLY - 以只读方式使用共享内存
SHM_RND - 只在shmaddr参数非NULL时起作用
4.卸载共享内存
#include <sys/shm.h> int shmdt(const void* shmaddr); 成功返回0,失败返回- --shmaddr:共享内存起始地址
5.销毁/控制共享内存
#include <sys/shm.h> int shmctl(int shmid,int cmd,struct shmid_ds* buf); 成功返回0,失败返回- --shmid:共享内存标志符
--cmd:控制命令,可取以下值
IPC_STAT -获取共享内存的属性,通过buf参数输出
IPC_SET -设置共享内存的属性,通过buf参数输入,仅以下三个属性可以设置 shmid_ds::shm_perm.uid//拥有者用户ID
shmid_ds::shm_perm.gid//拥有者组ID
shmid_ds::shm_perm.mode//权限
IPC_RMID -销毁共享内存。不是真的销毁,只是做个销毁标记,禁止任何进程对该共享内存形成新的加载
-buf:shmid_ds类型的共享内存属性结构
6.消息队列
创建/获取消息队列
#include <sys/msg.h> int msgget(key_t key,int msgflg); 成功返回消息队列标志符,失败返回- -key:消息队列键
-msgflg:创建标志,可取以下值
-获取,不存在即失败
IPC_CREAT :创建,不存在即失败
IPC_EXCL -排斥,已存在即失败
发送消息
#include <sys/msg.h> int msgsnd (int msqid,const void* msgp,size_t msgsz,int msgflg); 成功返回0,失败返回- -msqid:消息队列标志符
-msgp:指向一个包含消息类型和消息数据的内存块。
-msgsz:期望发送消息数据的字节数
-msgflg :发送标志,一般取0即可
接收消息
#include <sys/msg.h> ssize_t msgrcv (int msqid,void* msgp,size_t msgsz,long msgtyp,int msgflg); 成功返回所接收消息数据的字节数,失败返回- --msqid:消息队列标志符
--msgp:指向一块包含消息类型(4字节)和消息数据的内存
--msgsz :期望接收消息数据的字节数
销毁或控制消息队列
#include <sys/msg.h> int msgctl(int msqid,int cmd,struct msqid_ds* buf);
成功返回0,失败返回- -msqid:消息队列标志符 --cmd:控制命令,可取以下值
IPC_STAT -获取共享内存的属性,通过buf参数输出
IPC_SET -设置共享内存的属性,通过buf参数输入,仅以下三个属性可以设置 shmid_ds::shm_perm.uid//拥有者用户ID
shmid_ds::shm_perm.gid//拥有者组ID
shmid_ds::shm_perm.mode//权限
IPC_RMID -销毁共享内存。不是真的销毁,只是做个销毁标记,禁止任何进程对该共享内存形成新的加载
-buf:shmid_ds类型的共享内存属性结构
7.信号量
创建\获取信号量集
#include <sys.sem.h> int semget (key_t key,int nsems,int semflg); 成功返回信号量集标志符,失败返回- -key :信号量集键
-nsems:信号量个数
-semflg:创建标志,可取以下值
-获取,不存在即创建,已存在即获取
IPC_CREAT -创建,不存在即创建,已存在即获取
IPC_EXCL -排斥,已存在即失败
操作信号量集
#include <sys.sem.h> int semop(int semid,struct sembuf* sops,unsigned nsops); 成功返回0,失败返回- -semid:信号量集标志符
-sops:操作结构体数组
-nsops:操作结构体数组的长度 struct sembuf{
unsigned short sem_num;//信号量编号
short sem_op;//操作数
short sem_flg;//操作标志
};
销毁\控制信号量集
#include <sys/sem.h> int semctl(int semid,int semnum,int cmd,....); 成功返回0(cmd取某些值时存在例外),失败返回- -semid:信号量集标志符
-semnum:信号量编号
-cmd:控制命令
UNIX C XSI_IPC对象、共享内存的更多相关文章
- UNIX环境下的共享内存
好久没更新博客了,最近几个月一直在忙项目,现在终于有时间进一步学习了.这次记录的是unix环境中共享内存的使用方法. 在我理解,共享内存就是在内存中开辟一段空间,各个毫不相干的进程就可以通过访问这段 ...
- Unix IPC之基于共享内存的计数器
目的 本文主要实现一个基于共享内存的计数器,通过父子进程对其访问. 本文程序需基于<<Unix网络编程-卷2>>的环境才能运行.程序中大写开头的函数为其小写同名函数的包裹函数, ...
- <转>UNIX 共享内存应用中的问题及解决方法
http://www.ibm.com/developerworks/cn/aix/library/au-cn-sharemem/ 共享内存是一种非常重要且常用的进程间通信方式,相对于其它IPC机制,因 ...
- vector存入共享内存(了解)
昨天在上篇blog里描写了如何把STL容器放到共享内存里去,不过由于好久不写blog,发觉词汇组织能力差了很多,不少想写的东西写的很零散,今天刚好翻看自己的书签,看到一篇挺老的文章,不过从共享内存到S ...
- Boost:shared_memory_object --- 共享内存
什么是共享内存 共享内存是最快速的进程间通信机制.操作系统在几个进程的地址空间上映射一段内存,然后这几个进程可以在不需要调用操作系统函数的情况下在那段内存上进行读/写操作.但是,在进程读写共享内存时, ...
- 进程间通信IPC:消息队列,信号量,共享内存
2015.3.4星期三 阴天 进程间通信:IPC 文件对象:记录文件描述符,文件开关等 IPC标示符:系统全局的流水号两个进程要通信,打开的是唯一的对象进行通讯,通过key操作 XSI IPC:消息队 ...
- redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换
一. 概述 对于前面的五章中,已清楚了数据对象的类型以及命令实现,其实还有一种数据对象为HyperLogLog,以后需要用到再了解.下面再了解类型检查,内存回收,对象共享,对象的空转时长. 1.1 ...
- Unix IPC之共享内存区(1)
1 共享内存区 共享内存区是可用IPC形式中最快的,只有映射和解除映射需要进入内核的系统调用,映射后对共享内存区的访问和修改不再需要系统调用(内核只要负责好页表映射和处理页面故障即可),但通常需要同步 ...
- UNIX网络编程 12 15共享内存区
管道,FIFO,消息队列,在两个进程交换信息时,都要经过内核传递 共享内存可以绕过,默认fork生成的子进程 并不与父进程共享内存区 mmap munmap msync 父子进程共享内存区的方法之一是 ...
随机推荐
- ACdream 1125(ACfun-字典序)
A - ACfun Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitSta ...
- 【独立开发人员er Cocos2d-x实战 009】Cocos2dx 菜单项CCMenu使用
Cocos2dx中的菜单用CCMenu/Menu类来实现.该类是一个容器.用来装载各种菜单项,用于菜单项能够是图片.系统字体等. 理论就不说了.先上代码: CCMenuItemToggle* item ...
- Solution:Cannot pull with rebase: You have unstaged changes in Github
You can do this to work around using following steps 1. stash your changes with: git stash 2. pull f ...
- CodeForces - 557D Vitaly and Cycle(二分图)
Vitaly and Cycle time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- django入门与实践 3-1 环境搭建
Python 2.7 .Django对2.7.3.5.3.4都是支持的. https://www.djangoproject.com/download/ django对python的兼容情况 pip安 ...
- PCB genesis Slot槽转钻孔(不用G85命令)实现方法
PCB钻Slot槽一般都采用G85命令钻槽孔,而采用G85命令工程CAM无法准确的知道Slot槽钻多少个孔,并不能决定钻槽孔的顺序,因为采用G85命令钻孔密度与钻槽顺序由钻机本身决定的.在这里介绍一种 ...
- E20171006-hm
trace vt. 跟踪,追踪; 追溯,探索; 探索; 查找; vi. 沿着一小径或道路前进; 可以追溯的; n. 痕迹; 痕迹,踪迹; 微量,极少量; [植 ...
- 等价表达式 2005年NOIP全国联赛提高组(栈模拟)
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- akka设计模式系列-消息模型
通过前面的文章我们总结了几个常见的actor设计模式,但此处不得不提前介绍一下在Akka中消息的设计模式.随着对Akka的使用,我们会发现,使用Akka设计系统其实就是面向消息编程.actor之间消息 ...
- 微信小程序商品展示页面(仿咸鱼)
项目中做了一个商品发布展示的页面,记录下来 解决问题: 想在setData中更改数组具体下标中的某个值: let one = "lowMoney[" + 0 + "].m ...