共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区。在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一个共享内存区的最大字节数shmmax,系统范围内最大共享内存区标识符数shmmni等,可以手工对其调整,但不推荐这样做。

一、应用

共享内存的使用,主要有以下几个API:ftok()、shmget()、shmat()、shmdt()及shmctl()。

1)用ftok()函数获得一个ID号.

应用说明:

在IPC中,我们经常用用key_t的值来创建或者打开信号量,共享内存和消息队列。

函数原型:

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

Keys:

1)pathname一定要在系统中存在并且进程能够访问的

3)proj_id是一个1-255之间的一个整数值,典型的值是一个ASCII值。

当成功执行的时候,一个key_t值将会被返回,否则-1被返回。我们可以使用strerror(errno)来确定具体的错误信息。

考虑到应用系统可能在不同的主机上应用,可以直接定义一个key,而不用ftok获得:

#define IPCKEY 0x344378

2)shmget()用来开辟/指向一块共享内存的函数

应用说明:

shmget()用来获得共享内存区域的ID,如果不存在指定的共享区域就创建相应的区域。

函数原型:

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

key_t key 是这块共享内存的标识符。如果是父子关系的进程间通信的话,这个标识符用IPC_PRIVATE来代替。如果两个进程没有任何关系,所以就用ftok()算出来一个标识符(或者自己定义一个)使用了。

int size 是这块内存的大小.

int flag 是这块内存的模式(mode)以及权限标识。

模式可取如下值:

IPC_CREAT 新建(如果已创建则返回目前共享内存的id)

IPC_EXCL 与IPC_CREAT结合使用,如果已创建则则返回错误

然后将“模式” 和“权限标识”进行“或”运算,做为第三个参数。

如: IPC_CREAT | IPC_EXCL | 0640

例子中的0666为权限标识,4/2/1 分别表示读/写/执行3种权限,第一个0是UID,第一个6(4+2)表示拥有者的权限,第二个4表示同组权限,第3个0表示他人的权限。

这个函数成功时返回共享内存的ID,失败时返回-1。

关于这个函数,要多说两句。

创建共享内存时,shmflg参数至少需要 IPC_CREAT | 权限标识,如果只有IPC_CREAT 则申请的地址都是k=0xffffffff,不能使用;

获取已创建的共享内存时,shmflg不要用IPC_CREAT(只能用创建共享内存时的权限

标识,如0640),否则在某些情况下,比如用ipcrm删除共享内存后,用该函数并用IPC_CREAT参数获取一次共享内存(当然,获取失败),则即使再次创建共享内存也不能成功,此时必须更改key来重建共享内存。

3) shmat()将这个内存区映射到本进程的虚拟地址空间。

函数

linux 共享内存陷井,linux共享内存应用与陷阱相关推荐

  1. Linux进程间的通信----->共享内存

    共享内存:         顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进程之间共享的内存通常安排为同一段物 ...

  2. 好文转载 Linux环境进程间通信(五): 共享内存(上)

    http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写 ...

  3. Linux环境进程间通信(五): 共享内存(上)

    Linux环境进程间通信(五): 共享内存(上) 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.两个不同进程A.B共享内存的意思是,同一块物理内存被映射到进程A.B各自的进程地址空间. ...

  4. Linux访问其他进程空间,Linux环境进程间通信系列(五):共享内存

    共享内存可以说是最有用的进程间通信方式,也是最快的 IPC 形式.两个不同进程 A . B 共享内存的意思是,同一块物理内存被映射到进程 A . B 各自的进程地址空间.进程 A 可以即时看到进程 B ...

  5. Linux IPC实践(9) --System V共享内存

    共享内存API #include <sys/ipc.h> #include <sys/shm.h>int shmget(key_t key, size_t size, int ...

  6. linux查看共享内存max,浅析Linux的共享内存与tmpfs文件系统

    浅析Linux的共享内存与tmpfs文件系统 前言 共享内存主要用于进程间通信,Linux有两种共享内存(Shared Memory)机制: (1)** System V shared memory( ...

  7. linux mmap实例_Linux下通过共享内存和mmap实现进程间通讯(含实例)

    前言 最近在学习GNU/Linux内核,看到mmap的时候书上说: mmap/munmap接口函数是用户最常用的两个系统调用接口,无论是在用户程序中分配内存.读写大文件.链接动态库文件,还是多进程间共 ...

  8. linux共享内存 dest,关于linux 共享内存查看已经完整释放

    完整删除共享内存脚本 #!/bin/sh function rmshm() { zero_status=`ipcs -m|awk '{print $6}'|grep -w 0|wc -l` if [ ...

  9. Linux(信号,进程间通信)共享内存,信号量,消息队列

    信号(signal) 1.1 什么是信号? 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式 1.2 信号的来源 硬件 [1] 用户在终端按下某些键时,终端驱动程序会发送信号给前台进程 ct ...

最新文章

  1. Postmaster主循环的大致流程
  2. uc/os-II(source)各种文件含义集锦
  3. 阻止 WSL 自动生成/etc/hosts 文件
  4. 评估创业项目的十大标准
  5. js中的json ajax,js结合json实现ajax简单实例
  6. SFP光模块是什么? SFP光模块的类型及应用介绍!
  7. centos php日志分析,记录一下CentOS7安装GoAccess日志分析工具
  8. Scala:未受重视却潜力巨大的Android编程语言
  9. matlab在伪随机码,MATLAB在伪随机码的生成及仿真中的应用
  10. 5、手把手教React Native实战之盒子模型BoxApp
  11. 集群资源管理与任务调度系统综述
  12. flutter微信登录集成
  13. 智能优化算法:海鸥算法原理及Matlab代码
  14. 妙啊!巧用 SSH 突破限制穿透内网
  15. JS实现动画特效2(缓动函数封装、导航栏筋斗云效果)
  16. Spark 第三讲 Scala数组与函数基础
  17. 论文阅读-(ECCV 2018) Second-order Democratic Aggregation
  18. 基于物联网的智慧油田的整体解决方案
  19. [NEFU]Python应用课程 PPT速记
  20. java图片管理系统_基于Java Web技术的图片管理系统的设计与实现.doc

热门文章

  1. linux静态分配设备号,Linux驱动开发之静态申请设备号
  2. think php自增,thinkphp5分表自增ID解决方案
  3. 计算机三级网络接口,计算机三级网络技术操作系统是怎样的?
  4. FCN网络训练 SIFTFLOW数据集
  5. 为什么Math.abs(Integr.MIN_VALUE)==Integer.MIN_VALUE
  6. 博客园自定义背景(一)
  7. kotlin 中 lambda 表达式的 return 行为
  8. Eclipse 一直Building Workspace 的解决办法
  9. 企业的无线安全问题综合解决方案
  10. Programming C# 4th Edition 中文版/英文版 对照阅读体验