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对象、共享内存的更多相关文章

  1. UNIX环境下的共享内存

    好久没更新博客了,最近几个月一直在忙项目,现在终于有时间进一步学习了.这次记录的是unix环境中共享内存的使用方法.  在我理解,共享内存就是在内存中开辟一段空间,各个毫不相干的进程就可以通过访问这段 ...

  2. Unix IPC之基于共享内存的计数器

    目的 本文主要实现一个基于共享内存的计数器,通过父子进程对其访问. 本文程序需基于<<Unix网络编程-卷2>>的环境才能运行.程序中大写开头的函数为其小写同名函数的包裹函数, ...

  3. <转>UNIX 共享内存应用中的问题及解决方法

    http://www.ibm.com/developerworks/cn/aix/library/au-cn-sharemem/ 共享内存是一种非常重要且常用的进程间通信方式,相对于其它IPC机制,因 ...

  4. vector存入共享内存(了解)

    昨天在上篇blog里描写了如何把STL容器放到共享内存里去,不过由于好久不写blog,发觉词汇组织能力差了很多,不少想写的东西写的很零散,今天刚好翻看自己的书签,看到一篇挺老的文章,不过从共享内存到S ...

  5. Boost:shared_memory_object --- 共享内存

    什么是共享内存 共享内存是最快速的进程间通信机制.操作系统在几个进程的地址空间上映射一段内存,然后这几个进程可以在不需要调用操作系统函数的情况下在那段内存上进行读/写操作.但是,在进程读写共享内存时, ...

  6. 进程间通信IPC:消息队列,信号量,共享内存

    2015.3.4星期三 阴天 进程间通信:IPC 文件对象:记录文件描述符,文件开关等 IPC标示符:系统全局的流水号两个进程要通信,打开的是唯一的对象进行通讯,通过key操作 XSI IPC:消息队 ...

  7. redis 系列15 数据对象的(类型检查,内存回收,对象共享)和数据库切换

    一.  概述 对于前面的五章中,已清楚了数据对象的类型以及命令实现,其实还有一种数据对象为HyperLogLog,以后需要用到再了解.下面再了解类型检查,内存回收,对象共享,对象的空转时长. 1.1 ...

  8. Unix IPC之共享内存区(1)

    1 共享内存区 共享内存区是可用IPC形式中最快的,只有映射和解除映射需要进入内核的系统调用,映射后对共享内存区的访问和修改不再需要系统调用(内核只要负责好页表映射和处理页面故障即可),但通常需要同步 ...

  9. UNIX网络编程 12 15共享内存区

    管道,FIFO,消息队列,在两个进程交换信息时,都要经过内核传递 共享内存可以绕过,默认fork生成的子进程 并不与父进程共享内存区 mmap munmap msync 父子进程共享内存区的方法之一是 ...

随机推荐

  1. LeetCode 168. Excel Sheet Column Title (Excel 表格列名称)

    Given a positive integer, return its corresponding column title as appear in an Excel sheet. For exa ...

  2. git-svn for mac

    熟练使用 git ,新公司用的是 svn,这就尴尬了,为了这个习惯问题,我还是毅然坚持使用 git,但是又不与公司的 svn 冲突,所以就找到了 git 的 git-svn 插件. 在 mac 上使用 ...

  3. HDU5501/BestCoder Round #59 (div.2)The Highest Mark dp+贪心

    The Highest Mark 问题描述 2045年的SD省队选拔,赛制和三十年前已是完全不同.一场比赛的比赛时间有 tt 分钟,有 nn 道题目. 第 ii 道题目的初始分值为 A_i(A_i \ ...

  4. Execution Order In a Test Plan

    1.Config Element 2.Pre  Processors 3.Timer 4.Sampler 5.Post Processors 6.Assertions 7.Listener

  5. android studio中xml文件代码提示问题

    在系统控件中输入“a”能提示出android:id等所有属性.而在第三方库的控件中输入“a”只会提示“appNs”,但如果手动写app:id="@+id/aaa"系统也是可以识别的 ...

  6. XAML实例教程系列 - 开篇(一)

    XAML实例教程系列 - 开篇 2012-05-14 11:47 by jv9, 5588 阅读, 8 评论, 收藏, 编辑 去年,曾答应银光中国论坛的朋友推出一个关于XAML语言实例教程系列,帮助学 ...

  7. P4111 [HEOI2015]小Z的房间 生成树计数

    这个题是生成树计数的裸题,中间构造基尔霍夫矩阵,然后构成行列式,再用高斯消元就行了.这里高斯消元有一些区别,交换两行行列式的值变号,且消元只能将一行的数 * k 之后加到别的行上. 剩下就没啥了... ...

  8. PCB Genesis 无需启动Xmanager图形窗口运行脚本 实现方法

    从事PCB工程行业的都知道,启动Genesis需2个exe程序(Xmanager.exe与get.exe)需一起启动才可以打开我们熟悉的软件, 而Xmanager是图形窗口是给用户UI交互使用的,如果 ...

  9. MSXML2.XMLHTTP.4.0对象

    一.使用步骤:1.创建XMLHTTP对象 //需MSXML4.0支持2.打开与服务端的连接,同时定义指令发送方式,服务网页(URL)和请求权限等.客户端通过Open命令打开与服务端的服务网页的连接.与 ...

  10. P2251 质量检测(ST表)

    P2251 质量检测 题目描述 为了检测生产流水线上总共N件产品的质量,我们首先给每一件产品打一个分数A表示其品质,然后统计前M件产品中质量最差的产品的分值Q[m] = min{A1, A2, ... ...