解决Linux system v 共享内存问题

system v 共享内存

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

建立:进程与共享内存的关联关系

key_t key:16进制的非0数字。

一般有两种方式设置它。

第一种:调用fotk函数

第二章:直接使用IPC_PRIVATE

size:共享内存的大小

shmflg:

  • IPC_CREAT
  • IPC_EXCL
  • 用户,组用户,其他用户对这片内存的权限,有9个bit来表示,比如664

返回值:成功返回这片共享内存的标识号;失败返回-1,errno被设置。

#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);

shmid:由shmget函数创建的,也就是shmget函数的返回值

shmaddr:

NULL:让内核去申请内存空间

非NULL:自己用malloc开辟一个空间,让共享内存shmid和这个地址关联上。但是如果不是4K的整数倍,内核会向上或者向下调整。

shmflg:

SHM_RND:读写

SHM_RDONLY:只读

返回值:

成功:返回内存地址

失败:返回(void *) -1

#include <sys/types.h>
#include <sys/shm.h>
int shmdt(const void *shmaddr);

取消进程与共享内存的关联关系

shmaddr:shmat的返回值

返回值:成功0;失败-1,并设置errno。

#include <sys/types.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);

对共享内存操作,更具cmd的不同,对共享内存进行不同的操作。

shmid:由shmget函数创建的,也就是shmget函数的返回值

cmd:

IPC_STAT:得到共享内存的状态

IPC_RMID:标记删除共享内存(当共享内存的引用计数变为0时,删除)

IPC_SET:设置共享内存的属性(修改权限,修改shmid等)

等等

buf:shmid_ds结构体

返回值:当cmd是IPC_RMID时:成功0;失败-1,并设置errno

用命令【ipcs】可以查看共享内存的状态

------ Shared Memory Segments --------
key    shmid   owner   perms   bytes   nattch   status
0x00007fff 65536   ys     664    256    0
0x00007ffe 98305   ys     664    256    0
0x0000555e 131074   ys     664    256    0
0x00000011 229379   ys     664    256    3
  • key:函数shmget指定的第一个参数
  • shmid:函数shmget的返回值
  • owner:属于哪个用户创建的
  • perms:这个共享内存的访问权限
  • bytes:大小
  • nattch:使用这个共享内存的进程的数量
  • status:共享内存的状态

总结

以上所述是小编给大家介绍的解决Linux system v 共享内存问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

时间: 2019-07-28

Linux共享内存实现机制的详解

Linux共享内存实现机制的详解 内存共享: 两个不同进程A.B共享内存的意思是,同一块物理内存被映射到进程A.B各自的进程地址空间.进程A可以即时看到进程B对共享内存中数据的更新,反之亦然.由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以. 效率: 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据[1]: 一次从输入文件到

linux 共享内存

概述 如果想在Apache/EAPI中具有共享内存的支持,那么就要建立MM共享内存库.在这种情况下,它将允许mod_ssl使用一种高效的基于RAM的会话(session)缓存代替基于磁盘的会话缓存. 注意事项 下面所有的命令都是Unix兼容的命令. 源路径都为"/var/tmp"(当然在实际情况中也可以用其它路径). 安装在RedHat Linux 6.1下测试通过. 要用"root"用户进行安装. Mm 的版本号是1.0.12. 软件包的来源 MM的主页: 必须确

详解Linux进程间通信——使用共享内存

一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进程之间共享的内存通常安排为同一段物理内存.进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样.而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程. 特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束

详解Android Ashmem匿名共享内存

目录 1. 简述 2. 创建 MemoryFile 和 数据写入 3. 将文件描述符传递到其他进程 4. 在其他进程接收 FileDescriptor 并读取数据 1. 简述 Android 的 匿名共享内存(Ashmem) 基于 Linux 的共享内存,都是在临时文件系统(tmpfs)上创建虚拟文件,再映射到不同的进程.它可以让多个进程操作同一块内存区域,并且除了物理内存限制,没有其他大小限制.相对于 Linux 的共享内存,Ashmem 对内存的管理更加精细化,并且添加了互斥锁.Java 层

详解Linux进程间通信——使用信号量

一.什么是信号量 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域.临界区域是指执行数据更新的代码需要独占式地执行.而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它,也就是说信号量是用来调协进程对共享资源的访问的. 信号量是一个特殊的变量,程序对其访问都是原子操作,且只允许对它进行等待(即P(信号变量))和发送(即V(信号变量))信息操作.最简单的信号量是只

详解Linux动态库生成与使用指南

Linux下动态库文件的文件名形如 libxxx.so,其中so是 Shared Object 的缩写,即可以共享的目标文件. 在链接动态库生成可执行文件时,并不会把动态库的代码复制到执行文件中,而是在执行文件中记录对动态库的引用. 程序执行时,再去加载动态库文件.如果动态库已经加载,则不必重复加载,从而能节省内存空间. Linux下生成和使用动态库的步骤如下: 编写源文件. 将一个或几个源文件编译链接,生成共享库. 通过 -L<path> -lxxx 的gcc选项链接生成的libxxx.so

详解Linux time 命令的使用

1.命令简介 time 用于统计命令执行所消耗的时间及相关系统资源等信息.time 可以显示的资源有四大项,分别是: Time resources Memory resources IO resources Command info 2.命令格式 time [options] command [arguments...] 3. 选项说明 -f FORMAT, --format=FORMAT:使用指定格式输出.如果没有指定输出格式,采用环境变量 TIME 指定的格式 -p, --portabili

详解Java虚拟机管理的内存运行时数据区域

详解Java虚拟机管理的内存运行时数据区域 概述 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁. 程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基

详解Linux下读取位图的注意事项

详解Linux下读取位图的注意事项 在Linux下读取位图遇到的问题,很好地体现了linux与Windows操作系统的不同.按理说位图格式与操作系统无关,读取也应该无关,实际上在位图读到内存中时已经不同.下面主要介绍自己在Linux下操作位图遇到的问题. (一).位图结构 位图一开始是两个结构体,包括位图的详细信息,是读取后面数据的关键.所以读取位图首先要正确读取这两个结构体:BITMAPFILEHEADER和BITMAPINFOHEADER.其具体定义为: typedef struct tag

详解 Linux 常用目录的作用

 详解 Linux 常用目录的作用 一 常用一级目录 注意: 1.根目录下的bin和sbin,usr目录下的bin和sbin,这四个目录都是用来保存系统命令的. 2.bin目录下的命令时任何用户都能执行,sbin目录下的命令只有超级用户才能执行. 3.media用来挂载光盘,misc挂载磁带机,mnt挂载U盘.它们都是空目录. 4.proc和sys目录不能直接操作,这两个目录保存的是内存挂载点. 5.可以在家目录root或home,以及tmp目录下随便放内容. 二 实战 [root@localh

详解Linux系统配置nginx的负载均衡

详解Linux系统配置nginx的负载均衡 负载均衡的几种方式: 1.轮询:默认按照时间顺序对所有服务器一个一个的访问,如果有服务器宕机,会自动剔除: 2.weight:服务器的方位几率和weight成正比,这个可以在服务器配置不均的时候进行配置: 3.ip_hash:对每个请求的ip进行hash计算,并按照一定的规则分配对应的服务器(可解决session共享): 4.fair:按照每台服务器的响应时间(rt)来分配请求,rt知道优先分配: 5.url_hash:按照访问url的hash值来分配

详解linux dma驱动编写

linux下面的驱动虽然什么样的情形都有,但是dma驱动却并不少见.dma可以有很多的好处,其中最重要的功能就是能够帮助我们将数据搬来搬去,这个时候cpu就由时间去做别的事情了,提高了设备效率. 1.dma驱动在什么地方 drivers/dma 2.如何看s3c的dma驱动,先看Kconfig config S3C24XX_DMAC bool "Samsung S3C24XX DMA support" depends on ARCH_S3C24XX || COMPILE_TEST se