iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >shmget() -- 建立共享内存
  • 101
分享到

shmget() -- 建立共享内存

2023-06-04 21:06:44 101人浏览 泡泡鱼
摘要

shmget() -- 建立共享内存版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明Http://leezen.blogbus.com/logs/19564086.html #include #include

shmget() -- 建立共享内存

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
Http://leezen.blogbus.com/logs/19564086.html

#include
#include
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_RSHM_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;
int shm_segsz;
__kernel_time_t shm_atime;
__kernel_time_t shm_dtime;
__kernel_time_t shm_ctime;
__kernel_ipc_pid_t shm_cpid;
__kernel_ipc_pid_t shm_lpid;
unsigned short shm_nattch;
unsigned short shm_unused;
void *shm_unused2;
void *shm_unused3;
};


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

--结束END--

本文标题: shmget() -- 建立共享内存

本文链接: https://www.lsjlt.com/news/239734.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • shmget() -- 建立共享内存
    shmget() -- 建立共享内存版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://leezen.blogbus.com/logs/19564086.html #include #include ...
    99+
    2023-06-04
  • c++怎么创建共享内存
    在C++中,可以使用操作系统的系统调用或者第三方库来创建共享内存。1. 使用操作系统的系统调用:在Unix/Linux操作系统中,可...
    99+
    2023-08-20
    c++
  • c++ windows下创建共享内存
    在Windows下,可以使用CreateFileMapping函数来创建共享内存。以下是一个示例代码:```cpp#include ...
    99+
    2023-08-19
    windows
  • 【Linux】system V 共享内存
    文章目录 system V1. 共享内存原理第一阶段原理第二阶段原理 2. 直接写代码--编写代码进行原理介绍shmget函数ftok函数key值用法 1. 创建key值2. 创建共享内存 获取共享内存3. 将自己和共...
    99+
    2023-08-21
    linux 服务器 运维
  • win11如何建立共享家庭组
    今天小编给大家分享一下win11如何建立共享家庭组的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先右击Win11系统桌面的...
    99+
    2023-07-01
  • xp环境下如何建立共享
    这篇文章给大家分享的是有关xp环境下如何建立共享的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  xp环境下建立共享的方法:  xp下默认建立共享方法的原理是在无线网卡的属性里面有“无线网络配置”,然后选择添加,...
    99+
    2023-06-13
  • Linux中如何共享内存
    这篇文章给大家分享的是有关Linux中如何共享内存的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1 共享内存的概念及使用过程1)共享内存的概念共享内存是IPC机制中的一种。共享内存:即允许两个或多个进程共享一个给...
    99+
    2023-06-15
  • php怎么创建共享内存减少负载
    这篇文章主要介绍“php怎么创建共享内存减少负载”,在日常操作中,相信很多人在php怎么创建共享内存减少负载问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php怎么创建共享内存减少负载”的疑惑有所帮助!接下来...
    99+
    2023-07-04
  • 云服务器共享内存
    云服务器共享内存的出现可以让用户在不同的云服务器上共享相同的内存空间,而无需为每个应用程序单独购买和管理内存空间。这种技术的优势在于,它可以让用户在多个云服务器上访问相同的数据和文件,并且无需担心数据和文件的安全问题。 使用云服务器共享内...
    99+
    2023-10-27
    内存 服务器
  • linux怎么删除共享内存
    在Linux系统中,可以使用ipcs命令查看当前共享内存的情况。然后可以使用ipcrm命令删除共享内存。1. 使用ipcs命令查看共...
    99+
    2023-08-20
    linux
  • php共享内存如何设置
    在PHP中,可以使用`shmop`扩展来操作共享内存。以下是设置共享内存的步骤:1. 创建共享内存段:使用`shmop_open()...
    99+
    2023-09-26
    php
  • PHP入门指南:共享内存
    在Web开发领域中,PHP是一种非常流行的编程语言。它被广泛应用于动态网站的开发,也用于开发各种类型的框架和应用程序。在这个快速发展的行业中,学习PHP编程语言可以为您打开许多机会。在本篇文章中,我们将分享共享内存的相关知识,以帮助初学者掌...
    99+
    2023-05-20
    PHP 入门指南 共享内存
  • python怎么共享内存通信
    在Python中,可以使用多种方式来实现进程间的共享内存通信,下面是一些常用的方法: 使用`multiprocessing`模块中...
    99+
    2023-10-25
    python
  • 如何建立云服务器网络共享
    建立云服务器网络共享可以通过以下几种方法: 使用公共云计算服务:在公共云计算服务提供商(例如Amazon、Microsoft、Google等)上创建网络共享。这将允许您通过一个公共地址访问您的数据,并可以使用公共计算资源来处理和分析您的...
    99+
    2023-10-26
    服务器 网络
  • 建立云服务器网络共享系统
    1. 选择合适的云服务器 在建立云服务器网络共享系统之前,首先需要选择一款合适的云服务器。需要考虑的因素包括服务器的性能、存储容量、网络带宽、安全性等。建议选择知名的云服务器提供商,如阿里云、腾讯云、AWS等。 2. 安装操作系统 在选择...
    99+
    2023-10-27
    服务器 系统 网络
  • 怎样建立云服务器网络共享
    建立云服务器网络共享通常包括以下步骤: 确定云服务器网络共享的目的地:确定云服务器网络共享的具体目的地是在内部网,还是公共云存储服务器,或者是其他共享云服务器的服务。 配置云服务器网络共享:根据具体云服务器网络共享目的地,配置云服务器网...
    99+
    2023-10-26
    服务器 网络
  • 如何在 Go 中创建一个共享内存的 Goroutine?
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-16
  • nginx共享内存的机制详解
    目录1 共享内存申请2 共享内存实现原理2.1 共享内存组织2.2 slab共享内存管理机制2.3 slab与ngx_shm_zone_t 关系3 共享内存应用1 共享内存申请 共享...
    99+
    2024-04-02
  • C++中怎么实现共享内存
    C++中怎么实现共享内存,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。初次使用C++标准库实现共享内存的管理时,Vector每次分配内存个数不固定,回收也不固定,这样的话,程序...
    99+
    2023-06-17
  • 详解Android Ashmem匿名共享内存
    目录1. 简述2. 创建 MemoryFile 和 数据写入3. 将文件描述符传递到其他进程4. 在其他进程接收 FileDescriptor 并读取数据1. 简述 Android...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作