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 父子进程共享内存区的方法之一是 ...
随机推荐
- mac 下安装caffe(二)
使用Anaconda Python 1.brew edit opencv args << "-DPYTHON_LIBRARY=#{py_lib}/libpython2.7.#{d ...
- WebSocket握手总结
网址:http://blog.csdn.net/edwingu/article/details/44040961 WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器 ...
- B1299 [LLH邀请赛]巧克力棒 博弈论
这个题一看就是nim游戏的变形.每次先手取出巧克力就是新建一个nim,但假如先手取一个为0的而且无论后手怎么取剩下的都无法为零就行了.然后用dfs跑. 题干: Description TBL和X用巧克 ...
- 洛谷 P1498 南蛮图腾 —— 模拟
题目:https://www.luogu.org/problemnew/show/P1498 大约一年前该做的题...现在来填一下坑: 然而不怎么会模拟!还滚去看TJ了: 就是翻倍复制: \ 这个符号 ...
- App上架流程 & 上架被拒10大原因
上架前预热 先登陆自己的开发者账号(自己提前注册好 iOS 开发者账号,这里假设你已经拥有了一个 iOS 开发者账号),进入这个页面:https://developer.apple.com/accou ...
- iOS通讯录(纯纯的干货)
一.iOS8.0 1.访问用户通讯录的两个框架 (1)AddressBookUI.framework 提供了联系人列表界面.联系人详情界面.添加联系人界面等,一般用于选择联系人 (2)AddressB ...
- 客户端JavaScript Ajax
创建: 2017/10/21 完成: 2017/10/23 [TODO] 对Ajax收发各类型数据制作模板 补充跨域通信(cross origin) p457 HTTP通信 HTTP 超文本 ...
- codevs 2541 幂运算(迭代加深搜索)
2541 幂运算 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 从m开始,我们只需要6次运算就可以计算出m31 ...
- codevs3728联合权值(LCA)
3728 联合权值 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 输入描述 Input Des ...
- $tsinsenA1067$
\(problem\) 这种题目需要一个定理 \(a[1]+a[2]+a[3]+a[4]...=(a[1]%mod)+...\) 本人出奇的懒 然后 动态规划?(恰似枚举) #include < ...