UNIX C XSI_IPC对象、共享内存

1.创建IPC对象

  

#include <sys/ipc.h>

key_t ftok(const char* pathname,int proj_id);

成功返回可用于创建或获取IPC的键,失败则返回-1

2.创建、获取共享内存

#include <sys/shm.h>

int shmget(key_t key,size_t size,int shmflg);

成功返回共享内存标志符,失败返回-1

--key:共享内存键
--size:共享内存大小
--shmflg:创建标志,可取以下值
    0  -获取,不存在即失败
    IPC_CREAT -创建,不存在即创建,已存在即获取
    IPC_EXCL -排斥,已存在即失败

 

3.加载共享内存

#include <sys/shm.h>

void* shmat(int shmid,const void* shmaddr,int shmflg);

成功返回共享内存起始地址,失败返回-1

--shmid:共享内存标志符

--shmaddr:指定映射地址,可置NULL,由系统自动选择

--shmflg:加载标志

    0 -以读写方式使用共享内存
    SHM_RDONLY - 以只读方式使用共享内存
    SHM_RND  - 只在shmaddr参数非NULL时起作用

4.卸载共享内存

#include <sys/shm.h>

int shmdt(const void* shmaddr);

成功返回0,失败返回-1

--shmaddr:共享内存起始地址

5.销毁/控制共享内存

#include <sys/shm.h>

int shmctl(int shmid,int cmd,struct shmid_ds* buf);

成功返回0,失败返回-1

--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);

成功返回消息队列标志符,失败返回-1

-key:消息队列键
-msgflg:创建标志,可取以下值
0    -获取,不存在即失败
IPC_CREAT :创建,不存在即失败
IPC_EXCL -排斥,已存在即失败

  发送消息

#include <sys/msg.h>

int msgsnd (int msqid,const void* msgp,size_t msgsz,int msgflg);

成功返回0,失败返回-1

-msqid:消息队列标志符
-msgp:指向一个包含消息类型和消息数据的内存块。
-msgsz:期望发送消息数据的字节数
-msgflg :发送标志,一般取0即可

  接收消息

#include <sys/msg.h>

ssize_t msgrcv (int msqid,void* msgp,size_t msgsz,long msgtyp,int msgflg);

成功返回所接收消息数据的字节数,失败返回-1

--msqid:消息队列标志符
--msgp:指向一块包含消息类型(4字节)和消息数据的内存
--msgsz :期望接收消息数据的字节数

  销毁或控制消息队列

#include <sys/msg.h>

int msgctl(int msqid,int cmd,struct msqid_ds* buf);
成功返回0,失败返回-1

-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);

成功返回信号量集标志符,失败返回-1

-key :信号量集键
-nsems:信号量个数
-semflg:创建标志,可取以下值
    0 -获取,不存在即创建,已存在即获取
    IPC_CREAT -创建,不存在即创建,已存在即获取
    IPC_EXCL -排斥,已存在即失败

  

  操作信号量集

#include <sys.sem.h>

int semop(int semid,struct sembuf* sops,unsigned nsops);

成功返回0,失败返回-1

-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取某些值时存在例外),失败返回-1

-semid:信号量集标志符
-semnum:信号量编号
-cmd:控制命令
时间: 2024-10-14 15:34:30

UNIX C XSI_IPC对象、共享内存的相关文章

unix/linux下的共享内存、信号量、队列信息管理

在unix/linux下,经常有因为共享内存.信号量,队列等共享信息没有干净地清楚而引起一些问题.查看共享信息的内存的命令是ipcs [-m|-s|-q]. 默认会列出共享内存.信号量,队列信息,-m列出共享内存,-s列出共享信号量,-q列出共享队列清除命令是ipcrm [-m|-s|-q] id.-m 删除共享内存,-s删除共享信号量,-q删除共享队列.

UNIX网络编程:共享内存区

IPC形式除了管道.FIFO.信号量以外,还有共享内存区和消息队列.这里主要堆共享内存进行介绍. 共享内存区是可用IPC形式中最快的.一旦这样的内存区映射到共享它的进程地址空间,这些进程间数据的传递就不再涉及内核.共享内存与其他进程通信方式相比较,不需要复制数据,直接读写内存,是一种效率非常高的进程通信方案.但它本身不提供同步访问机制,需要我们自己控制.在LINUX中,只要把共享内存段连接到进程的地址空间中,这个进程就可以访问共享内存中的地址了.为了实现往该共享内存区存放和取出数据的进程间的同步

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

目的 本文主要实现一个基于共享内存的计数器,通过父子进程对其访问. 本文程序需基于<<Unix网络编程-卷2>>的环境才能运行.程序中大写开头的函数为其小写同名函数的包裹函数,增加了错误处理信息. 1 函数介绍 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include <sys/mman> /**  * Map addresses starting near ADDR an

vector存入共享内存(了解)

昨天在上篇blog里描写了如何把STL容器放到共享内存里去,不过由于好久不写blog,发觉词汇组织能力差了很多,不少想写的东西写的很零散,今天刚好翻看自己的书签,看到一篇挺老的文章,不过从共享内存到STL容器讲述得蛮全面,还提供了学习的实例,所以顺便翻译过来,并附上原文地址. 共享内存(shm)是当前主流UNIX系统中的一种IPC方法,它允许多个进程把同一块物理内存段(segment)映射(map)到它们的地址空间中去.既然内存段对于各自附着(attach)的进程是共享的,这些进程可以很方便的通

Oracle Study之--IPCS管理共享内存

Oracle Study之--IPCS管理共享内存 Unix/linux下的共享内存.信号量.队列信息管理 在unix/linux下,经常有因为共享内存.信号量,队列等共享信息没有干净地清除而引起一些问题. 查看共享信息的内存的命令是:ipcs [-m|-s|-q]. 默认会列出共享内存.信号量,队列信息 -m列出共享内存 -s列出共享信号量 -q列出共享队列 清除命令是:ipcrm [-m|-s|-q] id. -m 删除共享内存 -s删除共享信号量 -q删除共享队列. 案例分析: [[ema

Java共享内存

1   共享内存对应应用开发的意义 对熟知UNIX系统应用开发的程序员来说,IPC(InterProcess   Communication)机制是非常熟悉的,IPC基本包括共享内存.信号灯操作.消息队列.信号处理等部分,是开发应用中非常重要的必不可少的工具.其中共享内存IPC机制的关键,对于数据共享.系统快速查询.动态配置.减少资源耗费等均有独到的优点. 对应UNIX系统来说,共享内存分为一般共享内存和映像文件共享内存两种,而对应   Windows,实际上只有映像文件共享内存一种.所以jav

Boost:shared_memory_object --- 共享内存

什么是共享内存 共享内存是最快速的进程间通信机制.操作系统在几个进程的地址空间上映射一段内存,然后这几个进程可以在不需要调用操作系统函数的情况下在那段内存上进行读/写操作.但是,在进程读写共享内存时,我们需要一些同步机制. 考虑一下服务端进程使用网络机制在同一台机器上发送一个HTML文件至客户端将会发生什么: 服务端必须读取这个文件至内存,然后将其传至网络函数,这些网络函数拷贝那段内存至操作系统的内部内存. 客户端使用那些网络函数从操作系统的内部内存拷贝数据至它自己的内存. 如上所示,这里存在两

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

2015.3.4星期三 阴天 进程间通信:IPC 文件对象:记录文件描述符,文件开关等 IPC标示符:系统全局的流水号两个进程要通信,打开的是唯一的对象进行通讯,通过key操作 XSI IPC:消息队列,信号量,共享内存. ipcs 查看ip对象共享内存,信号量,消息队列等信息ipcrm 删除一个IP对象 Linux为用户提供了完善的,强大的网络功能完善的内置网络:其他操作系统不包含如此紧密的和内核结合在一起的网络部分 共享内存标示符的获取有两种方法:ftok(pathname,id)另一个是K

【UNIX】什么是IPC对象以及共享内存

sys V 的IPC 对象:对于内核中创建的文件对象,就是文件标识符(它引用了文件对象的全部信息)在进程中文件描述符一般使用当前最小可用值. 对于IPC标识符返回的是索引的整数值,它是全局变量的流水号,在系统中唯一分配的,若果在创建的IPC对象没有关闭,他会全局存在,只有在系统关闭的时候才关闭,这样会造成内存空间的资源被占用. 为了进程之间交换信息,内核专门留了一块内存空间,由进程映射到各自进程私有空间. [共享内存的实现]: 1)创建/打开共享内存,这里的创建/打开和文件的创建/打开差不多,只