共享内存--函数

2023-05-16

 

共享内存允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式。大多数的共享内存的具体实现,都把由不同进程之间共享的内存安排为同一段物理内存。

共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到它们自己的地址空间中。所有进程都可以访问共享内存中的地址,就好像它们是malloc分配的一样。如果一个进程向共享内存写入了数据,所做的改动将立刻被可以访问同一段共享内存的任何其他进程看到。

共享内存本身并未提供任何同步机制。在第一个进程结束对共享内存的写操作之前,并无自动的机制可以阻止第二个进程开始对它进行读取。对共享内存访问的同步控制必须由程序员来负责。

头文件: #include <sys/shm.h>

1、shmget函数

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

与信号量一样,程序需要提供一个参数key,它有效的为共享内存段命名,shmget函数返回一个共享内存标识符,该标识符将用于后续的共享内存函数。

第二个参数size以字节为单位指定需要共享的内存容量。

第三个参数shmflg包含九个比特的权限标志。

权限标志对共享内存非常有用,因为它们允许一个进程创建的共享内存可以被共享内存的创建者所拥有的进程写入,同时其他用户创建的进程只能读取该共享内存。我们可以利用这个功能来提供一种有效的对数据进行只读访问的方法,通过将数据放入共享内存并设置它的权限,就可以避免数据被其它用户修改。

如果共享内存创建成功,shmget返回一个非负整数,即共享内存标识符;如果失败,就返回-1.

 

2、shmat函数

第一次创建共享内存段时,它不能被任何进程访问。要想启用对该共享内存的访问,必须将其连接到一个进程的地址空间中。

这项工作由shmat函数来完成。

void *shmat(int   shm_id,  const void *shm_addr,int   shmflg);

第一个参数shm_id是由shmget返回的共享内存标识符。

第二个参数shm_addr指定的是共享内存连接到当前进程中的地址位置。它通常是一个空指针,表示让系统来选择共享内存出现的地址。

第三个参数shmflg是一组位标志。它的两个可能值是SHM_RND(这个标志与shm_addr联合使用,用来控制共享内存连接的地址)和SHM_RDONLY(它使得连接的内存只读)。我们很少需要控制共享内存连接的地址,通常让系统为你选择一个地址,否则就会使应用程序对硬件的依赖性过高。

如果shmat调用成功,它返回一个指向共享内存第一个字节的指针;如果失败,它就返回-1.

 

3、shmdt函数

shmdt函数的作用是将共享内存从当前进程中分离。它的参数是shmat返回的地址指针。成功时它返回0,失败时返回-1.注意,将共享内存分离并未删除它,只是使得该内存对当前进程不再可用。

 

4、shmctl函数

int shmctl(int shm_id, int command,struct  shmid_ds   *buf);

 

struct  shmid_ds{

uid_t   shm_perm.uid;

uid_t  shm_perm.gid;

mode_t  shm_perm.mode;

}

 

第一个参数shm_id是shmget返回的共享内存标识符。

第二个参数command是要采取的动作,它可以取三个值。

 

IPC_STAT        把shmid_ds结构中的数据设置为共享内存的当前关联值

IPC_SET          如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中的值

IPC_RMID        删除共享内存段

 

第三个参数buf是一个指针,它指向包含共享内存模式和访问权限的结构。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

共享内存--函数 的相关文章

  • Android手机中获取手机号码和运营商信息

    代码如下 xff1a package com pei activity import android app Activity import android os Bundle import android view View import
  • RTL8812AU双频无线网卡在ubuntu19和20上的驱动安装

    1 现象 xff1a 网卡插入电脑USB接口没反应 xff0c 信号灯不亮 xff0c 说明不识别 xff0c 需要安装驱动 2 驱动安装方法 xff1a 1 查看linux内核版本 xff1a uname a 本次使用的操作系统为ubun
  • IDEA 使用 Gralde 报错: Cause: zip END header not found

    开开心心的打开之前的 Gradle 微服务项目 xff0c 然后点击IDEA 右侧小图标大象图标开始刷新项目 xff0c 然后就报错了 xff1a 这个错误报的是真好 xff0c 我竟然没看出什么意思 xff0c 然后直接上百度和 Goog
  • 小知识 - 访问 http,防止浏览器自动跳转到 https

    目录 Chrome 浏览器Edge 浏览器 xff08 Chrome 内核 xff09 Safari 浏览器Opera 浏览器 xff08 Chrome 内核 xff09 Firefox 浏览器 如果 Nginx 端配置了重定向 xff08
  • 手写生产者—消费者模式

    生产者 消费者模式是一个很好的并发的问题 先说几个基础的点 xff1a wait notify notifyAll 都是Object的函数notify 仅仅通知一个线程 xff0c 并且不知道通知哪一个线程 xff0c 而notifyAll
  • ubuntu下date的用法

    方法一 xff1a sudo date 031421302011 月日时分年 方法二 xff1a sudo date s 20110314 先修改年月日 sudo date s 21 30 在修改时分 如果还需要修改BIOSS时间 xff0
  • Win Server版本去掉登陆密码

    单击 开始 运行 输入 34 netplwiz 34 rundll32 netplwiz dll UsersRunDll 可查看System32文件夹有没有该文件 或control userpasswords2 按回车键后弹出 用户帐户 窗
  • Python提取文本EOS符号

    提取整个文本中全部或结尾的标识符 除英文 xff0c 字母和汉字 提取整个文本中全部或结尾的标识符 除英文 xff0c 字母和汉字 import numpy as np import re path 61 r 39 D NMT Code n
  • 操作系统总结

    from http www cnblogs com yinluhui0229 archive 2011 05 30 2063607 html http my oschina net pangyangyang blog 188507 第一章
  • ubuntu打不开浏览器问题解决

    文 MESeraph 00 现象 在ubuntu下 xff0c 使用应用商店下载任何浏览器都打不开 以FireFox为例 xff1a 在cmd执行firefox命令显示如下 xff1a mkdir cannot create directo
  • Java Lambda表达式 常用工具类

    Runnable public static void main String args ExecutorService executorService 61 Executors newSingleThreadExecutor execut
  • ViewBinding 与 Kotlin 委托双剑合璧

    请点赞关注 xff0c 你的支持对我意义重大 x1f525 Hi xff0c 我是小彭 本文已收录到 GitHub Android NoteBook 中 这里有 Android 进阶成长知识体系 xff0c 有志同道合的朋友 xff0c 关
  • AndroidStudio安装kotlin插件及其配置过程

    AndroidStudio安装kotlin插件及其配置过程 1 打开androidstudio软件 xff0c 点击左上角的file gt setting进入设置向导界面 xff1b 如下图所示 xff1a 2 在弹出的设置向导中 xff0
  • SQL修改列名,增加列,删除列语句的写法

    1 修改数据表名 ALTER TABLE 表名 OLD TABLE NAME RENAME TO NEW TABLE NAME 2 修改列名 ALTER TABLE 表名 TABLE NAME RENAME COLUMN OLD COLUM
  • C语言实现阶乘的相加

    上一篇 xff0c 我总结了如何使用c语言实现阶乘的计算 xff0c 这里算是对以上的补充 xff1a 将阶乘累加 即1 xff01 43 2 xff01 43 3 xff01 43 43 10 好废话不多说 xff0c 直接上代码 xff
  • PTA 7-52 输出字符画:HAUT

    haut是一个你要上四年的大学 请你用字符画的形式输出haut 输入格式 无 输出格式 参考样例 输入样例 在这里给出一组输入 例如 xff1a 无 代码 include lt stdio h gt int main printf 34 h
  • Mysql 查询json字段(json_extract())

    假设我们在user表的extra字段中存储了一条json数据 xff1a 34 name 34 34 abab 34 34 tel 34 34 123456789 34 可以通过select json extract extra 39 na
  • layui图标显示不正常,显示成方块

    这两天打算写个uTools插件的 UI需求较低 所有就用了layui 使用习惯的毛病坑了自己 使用习惯的锅 使用其他UI框架的时候基本都是class后边跟上样式即可 在layui这边就也这样做了 但是layui文档写的也很清楚 他还需要在目
  • win10开启多用户同时远程登录-很详细

    背景 xff1a Win10 正常情况下不允许多用户同时远程 xff0c 即一个用户远程进来会把另一个用户踢掉 xff0c 因此需要破解才能使得多个用户同时登陆远程桌面 Win10多用户同时登陆远程桌面 允许多个RDP会话 本文亲测win1
  • 四旋翼惯导融合之观测传感器滞后问题汇总与巴特沃斯低通滤波器设计(气压计MS5611、GPS模块M8N、超声波、PX4FLOW等)

    前文讲到APM的三阶互补方案 xff0c 之前附的图是从学长博客里面抠的 xff0c 感觉还不是很详细 xff0c 于是自己就画了下 xff0c 顺便重新理一下思路 上图中下标为O的表示原始量 xff08 Origion xff09 C表示

随机推荐

  • SLC、MLC、TLC和QLC这几种存储颗粒的区别

    存储单元是硬盘的核心元件 xff0c 选择SSD实际上就是在选择存储颗粒 下面介绍下SLC MLC TLC和QLC这几种存储颗粒的区别 由于NAND闪存颗粒中存储密度存在差异 xff0c 所以NAND闪存又分为SLC MLC TLC和QLC
  • 海康威视网络摄像头配置本地存储服务器(远程连接查看回放)

    目录 环境 xff1a Win电脑A远程连接B查看录像 win电脑B存储录像 配置 方法 xff1a 海康小工具 海康威视网络摄像头答疑 环境 xff1a Win电脑A远程连接B查看录像 win电脑B存储录像 A B两台电脑 A电脑远程连接
  • Ubuntu18-22.04安装和干净卸载nvidia显卡驱动——超详细、最简单

    目录 方法一 xff1a 使用官方的NVIDIA驱动进行手动安装 xff08 稳定 靠谱 xff09 方法二 xff1a 使用系统自带的 软件和更新 程序 附加驱动更新 xff08 需要联网 xff0c 稳定性无法验证 xff09 浓缩极简
  • windows Server 2016 开启远程登录和多用户同时远程登录

    转载连接 xff1a 开启远程登录 xff1a windows Server 2016 开启远程登录 idomyway的博客 CSDN博客 前言 windows Server 2016 开启远程登录解决方法 我的电脑 右键属性 远程设置 远
  • 电脑开机显示器不显示BIOS界面,直接进入系统解决办法

    背景 xff1a 电脑开机没有电脑品牌的BIOS显示界面 xff0c 而是由黑屏直接进入系统 xff0c 导致无法正常进入BIOS 解决思路 xff1a 开机不显示BIOS界面 xff0c 直接到欢迎界面的可能性有 xff1a 1 开机过程
  • ubuntu-更新源提示-没有release文件-解决办法!

    背景 xff1a 以ubuntu21 04举例 安装完ubuntu系统 xff0c 执行 sudo apt update 更新源 xff0c 出现如下图错误 xff1a 说明你下载的ubuntu系统属于生命终结版本 xff0c 官方不再支持
  • ubuntu增加、删除、查看、赋予权限用户命令大全

    先说下增加用户的两种命令adduser和useradd的区别 xff1a 一 adduser username xff08 1 xff09 会在 etc passwd下面添加注册的账户 xff1a xff08 2 xff09 会在 etc
  • 组装机经验、软硬件故障排除、网络问题

    目录 主板 CPU 内存 显卡 判断显卡好坏的步骤 新买的显卡安装后显示器不亮 电源 其他 网络问题 主板 1 不同主板对于不同数量的内存条安装的位置有要求 xff0c 要按照主板规定的位置安装不同数量的内存条 xff0c 特别是服务器主板
  • Ubuntu系统安装和卸载xfce桌面环境

    Xfce是Linux操作系统的一种开源的免费桌面环境 xff0c 与其他Linux桌面 如GNOME和KDE 相比 xff0c 它消耗的内存和CPU最少 xff0c 这使得它更加轻便和快速 安装和卸载命令见下面链接 xff1a 如何在Ubu
  • 各版本ubuntu缺省内核

    ubuntu20 04 LTS 初始内核 xff1a 5 4 0 26 generic ubuntu21 04 LTS 初始内核 xff1a 5 11 0 16 generic ubuntu22 04 LTS 初始内核 xff1a 5 15
  • VSCode 提取扩展时出错。XHR failed 错误问题

    之前装过一些外网的软件 它的局域网端口是11223 之后不再用了的时候卸载了它 但发现VSCode在扩展商店搜索时会出现 提取扩展时出错 XHR failed 的错误 还有微信小程序开发时也会无法访问接口 提示 11223 什么的 具体的忘
  • Ubuntu 16.04分辨率只有800*600和1360*768分辨率选择,肿么办?

    xff08 1 xff09 首先使用 xrandr 命令列出当前所能检测到的分辨率 xff0c 如一台显示器19寸 xff0c 最佳分辨率为 1440x900 xff0c 由于 未能正确检测 xff0c 使用 xrandr 命令结果如下 x
  • 求字符串中的最长回文子串

    方法一 xff08 暴力法 xff09 xff1a include lt stdio h gt include lt string h gt bool Palindrome const char str int start int end
  • 堆和栈访问效率哪个更高

    1 栈分配的软件优势 xff1a 栈分配算法简单 xff0c 所以高效 xff1b 堆分配算法相对比较复杂 栈分配的硬件优势 xff1a 主要两点 xff0c cache和内存映射 如果在 栈上分配小块内存 xff0c 因为cache和内存
  • C++ Primer学习-第15章 面向对象编程

    15 1 面向对象编程 xff1a 概述 在C 43 43 中 xff0c 基类必须指出希望派生类重新定义那些函数 xff0c 定义为virtual的函数是基类期待派生类重新定义的 xff0c 基类希望派生类继承的函数不能定义为学虚函数 1
  • C++ map表的应用

    map表可以存储数据对应关系 include lt map gt include lt string gt include lt iostream gt using namespace std int main map lt int str
  • C++判断是否是IP地址

    判断是否是IP地址 bool isIPAddress const char s const char pChar bool rv 61 true int tmp1 tmp2 tmp3 tmp4 i while 1 i 61 sscanf s
  • C++判断是否是纯数字

    C 43 43 判断是否是纯数字 bool isDigitStr const char cstr if NULL 61 61 cstr cstr 0 61 61 0 return false int len 61 strlen cstr i
  • 命里有时终须有,命里无时莫强求

    命里有时终须有 xff0c 命里无时莫强求 今天是2012年2月24号 xff0c 和我谈了3个多月的女生突然之间说我们之间不合适 xff0c 让我以后不要再去骚扰她 真心第一次体会到失恋的感觉 xff0c 同时打电话给我姐姐诉说了下 xf
  • 共享内存--函数

    共享内存允许两个不相关的进程访问同一个逻辑内存 共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式 大多数的共享内存的具体实现 xff0c 都把由不同进程之间共享的内存安排为同一段物理内存 共享内存是由IPC为进程创建的一个特殊