版本声明:此文章来源于http://leezen.blogbus.com/logs/19564086.html,如果还想转载请看他的版本声明

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明<作者的版本声明>

#include <sys/ipc.h>
    #include <sys/shm.h>
    int shmget(key_t key, size_t size, int shmflg);

key_t key
-----------------------------------------------
    key标识共享内存的键值: 0/IPC_PRIVATE。 当key的取值为IPC_PRIVATE,则函数shmget()将创建一块新的共享内存;如果key的取值为0,而参数shmflg中设置了IPC_PRIVATE这个标志,则同样将创建一块新的共享内存。
    在IPC的通信模式下,不管是使用消息队列还是共享内存,甚至是信号量,每个IPC的对象(object)都有唯一的名字,称为“键”(key)。通过 “键”,进程能够识别所用的对象。“键”与IPC对象的关系就如同文件名称之于文件,通过文件名,进程能够读写文件内的数据,甚至多个进程能够共用一个文 件。而在IPC的通讯模式下,通过“键”的使用也使得一个IPC对象能为多个进程所共用。
    Linux系统中的所有表示System V中IPC对象的数据结构都包括一个ipc_perm结构,其中包含有IPC对象的键值,该键用于查找System V中IPC对象的引用标识符。如果不使用“键”,进程将无法存取IPC对象,因为IPC对象并不存在于进程本身使用的内存中。
    通常,都希望自己的程序能和其他的程序预先约定一个唯一的键值,但实际上并不是总可能的成行的,因为自己的程序无法为一块共享内存选择一个键值。因此,在 此把key设为IPC_PRIVATE,这样,操作系统将忽略键,建立一个新的共享内存,指定一个键值,然后返回这块共享内存IPC标识符ID。而将这个 新的共享内存的标识符ID告诉其他进程可以在建立共享内存后通过派生子进程,或写入文件或管道来实现。

int size(单位字节Byte)
-----------------------------------------------
    size是要建立共享内存的长度。所有的内存分配操作都是以页为单位的。所以如果一段进程只申请一块只有一个字节的内存,内存也会分配整整一页(在 i386机器中一页的缺省大小PACE_SIZE=4096字节)这样,新创建的共享内存的大小实际上是从size这个参数调整而来的页面大小。即如果 size为1至4096,则实际申请到的共享内存大小为4K(一页);4097到8192,则实际申请到的共享内存大小为8K(两页),依此类推。

int shmflg
-----------------------------------------------
    shmflg主要和一些标志有关。其中有效的包括IPC_CREAT和IPC_EXCL,它们的功能与open()的O_CREAT和O_EXCL相当。
    IPC_CREAT   如果共享内存不存在,则创建一个共享内存,否则打开操作。
    IPC_EXCL    只有在共享内存不存在的时候,新的共享内存才建立,否则就产生错误。

如果单独使用IPC_CREAT,shmget()函数要么返回一个已经存在的共享内存的操作符,要么返回一个新建的共享内存的标识符。如果将 IPC_CREAT和IPC_EXCL标志一起使用,shmget()将返回一个新建的共享内存的标识符;如果该共享内存已存在,或者返回-1。 IPC_EXEL标志本身并没有太大的意义,但是和IPC_CREAT标志一起使用可以用来保证所得的对象是新建的,而不是打开已有的对象。对于用户的读 取和写入许可指定SHM_R和SHM_W,(SHM_R>3)和(SHM_W>3)是一组读取和写入许可,而(SHM_R>6)和(SHM_W>6)是全局读取和写入许可。

返回值
-----------------------------------------------
成功返回共享内存的标识符;不成功返回-1,errno储存错误原因。
    EINVAL        参数size小于SHMMIN或大于SHMMAX。
    EEXIST        预建立key所致的共享内存,但已经存在。
    EIDRM         参数key所致的共享内存已经删除。
    ENOSPC        超过了系统允许建立的共享内存的最大值(SHMALL )。
    ENOENT        参数key所指的共享内存不存在,参数shmflg也未设IPC_CREAT位。
    EACCES        没有权限。
    ENOMEM        核心内存不足。

struct shmid_ds
-----------------------------------------------
    shmid_ds数据结构表示每个新建的共享内存。当shmget()创建了一块新的共享内存后,返回一个可以用于引用该共享内存的shmid_ds数据结构的标识符。

include/linux/shm.h

struct shmid_ds { 
        struct ipc_perm    shm_perm;      /* operation perms */ 
        int                shm_segsz;     /* size of segment (bytes) */ 
        __kernel_time_t    shm_atime;     /* last attach time */ 
        __kernel_time_t    shm_dtime;     /* last detach time */ 
        __kernel_time_t    shm_ctime;     /* last change time */ 
        __kernel_ipc_pid_t shm_cpid;      /* pid of creator */ 
        __kernel_ipc_pid_t shm_lpid;      /* pid of last operator */ 
        unsigned short     shm_nattch;    /* no. of current attaches */ 
        unsigned short     shm_unused;    /* compatibility */ 
        void               *shm_unused2; /* ditto - used by DIPC */ 
        void               *shm_unused3; /* unused */ 
    };

struct ipc_perm
-----------------------------------------------
    对于每个IPC对象,系统共用一个struct ipc_perm的数据结构来存放权限信息,以确定一个ipc操作是否可以访问该IPC对象。

struct ipc_perm { 
        __kernel_key_t   key; 
        __kernel_uid_t   uid; 
        __kernel_gid_t   gid; 
        __kernel_uid_t   cuid; 
        __kernel_gid_t   cgid; 
        __kernel_mode_t mode; 
        unsigned short   seq; 
};

shmget() -- 建立共享内存[zz] - [LINUX]相关推荐

  1. c语言中shmget相关函数,共享内存函数(shmget、shmat、shmdt、shmctl)及其范例 - guoping16的专栏 - 博客频道 - CSDN...

    2014年4月2日共享内存函数(shmget.shmat.shmdt.shmctl)及其范例 - guoping16的专栏 - 博客频道 - http://doc.xuehai.net 登录 | 注册 ...

  2. linux 查看共享内存最大值,linux上更改共享内存的最大值

    linux下更改共享内存的最大值 System V IPC 参数 名字 描述 合理取值 SHMMAX 最大共享内存段尺寸(字节) 最少若干兆(见文本) SHMMIN 最小共享内存段尺寸(字节) 1 S ...

  3. linux共享内存示例,linux 进程间共享内存示例

    写入端: #include #include #include #include #include using namespace std; struct MappingDataType { int ...

  4. linux如何看分配固定共享内存段,Linux共享内存的查看和删除

    在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误.您可以使用shell命令来查看与释放已经分配的共享内存,下面将详细说明如何进行查看和释放分配的共享内存的方法. 预备知识 L ...

  5. shmget创建共享内存errno - ipcs - From

    Thanks to: https://blog.csdn.net/libaineu2004/article/details/76919711 今天编写的程序,要使用一个共享内存,共享内存是由别的进程创 ...

  6. linux共享内存通信方式,linux下进程通信方式--共享内存

    1.概念 不同进程看到共同区域 2.特点 (1)是进程间通信最快的方式,对不同内存的映射(少了两次拷贝) (2)不提供任何同步互斥机制,也不自己维护 (3)接口简单 3.通信方式 由文件系统提供--管 ...

  7. linux查看共享内存文件,linux 共享内存

    #include #define BUFFER_SIZE 2048 int main() { pid_t pid; int shmid; char *shm_addr; char flag[] = \ ...

  8. linux删除某个用户的共享内存,删除Linux上的所有共享内存和信号量

    除了bvamos的回答,根据该文档中使用的sem被弃用: NAME再用ipcrm - 删除一个消息队列,信号量设定或共享存储器ID 概要再用ipcrm [-M键| -m id | -Q键| -q id ...

  9. Linux进程间通信源码剖析,共享内存(shmget函数详解)

    转至:http://blog.csdn.net/lanmanck/article/details/6092995 shmget int shmget(key_t key, size_t size, i ...

最新文章

  1. pandas获取数据行号,删除行数据
  2. 工作场合少聊事事非非
  3. Android开发8:UI组件TextView,EditText,Button
  4. 【转载】SAP集成会计凭证生成的原理
  5. 防止程序多开的两种方法
  6. python:实例化configparser模块读写配置文件
  7. G. Xor-MST(异或最小生成树)
  8. 钉钉设置jira机器人_这是当您机器学习JIRA票证时发生的事情
  9. CacheManager操作缓存
  10. 超5000元!骁龙660新机发布:限量供应价格感人
  11. 闭包(实例化)【面试】
  12. 网关是什么?有什么作用?
  13. vasp 模拟退火_vasp的分子动力学模拟
  14. 第十四周助教心得体会
  15. 读取照片的Exif信息
  16. 凡科服务器物理位置,建设网站教程
  17. 注意力机制详解(小白入门)
  18. axure RP文件如何找回_AXURE教程:管理后台页面框架
  19. 错误使用 load ASCII 文件的行号 1 中的文本未知“MATLAB“。
  20. Effective C++ 规则39:明智而谨慎的使用private继承

热门文章

  1. 重复照片查找软件Duplicate Photos Sweeper Mac
  2. 中医病案管理、编码、质控、直报、统计系统--正在开发中
  3. poi修改excel单元格值导致单元格变成橙色的问题(WPS)
  4. 《口袋侦探》闪退、打不开、玩不了的解决方式。
  5. 今晚和同事玩游戏了,累,但开心
  6. 【电子电路】ADC芯片如何选型
  7. Deepin-TIM / QQ / WeChat调整界面DPI字体大小的方法
  8. 输入一个整数,输出每个数字对应的拼音 (c++)
  9. henauOJ1042(折纸)
  10. 平方根计算在加速度传感器中的应用