接着上次的共享内存继续学习,这次主要是学习system v共享内存的使用,下面继续:

跟消息队列一样,共享内存也是有自己的数据结构的,system v共享内存也是随内核持续的,也就是说当最后一个访问内存共享的进程结束了,内核也不会自动删除共享内存段,除非显示去删除共享内在,其数据结构跟消息队列很类似:

跟消息队列一样,共享内存也提供了四个函数:

下面详细来看一下各函数的用法:

用法跟msgget函数一模一样,下面用代码来实验一下:

编译运行一下:

当共享内存创建好之后,则希望往共享内存当中进行写入操作,在写入之前,需要将共享内存映射到进程的地址空间,接下来来看一下第二个函数:

下面对其参数进行说明:

这个也是推荐的作法

关于这点,其实可以从帮助文档中查看到:

其中“SHMLBA”是等于4K=4096b的值,比如说shmaddr地址指定为4097,而这时所连接地址并不是4097,而是4097-(4097%4096)=4097-1=4096,而如果shmaddr地址指定为8193,这时所连接的地址为:8193-(8193%4096)=8193-1=8192,就是这个意思。

通常情况下,shmflg都指定为0,表示连接到的共享内存既可读也可以写。

下面来看另外一个函数:

所以接下来将共享内存映射到进程的地址空间当中,具体写法如下:

当执行完之后,可以解决映射:

下面运行一下:

为了观看到连接数,可以sleep一段时间,修改程序如下:

接下来从共享内存中读取数据:

运行:

之前已经说过,共享内存是随内核持续存在的,也就是它不会自动从内核中删除,可以通过下面这个函数来手动删除它,如下:

其中cmd的值可取如下:

下面则用此函数来删除共享内存段,当进程结束之后:

编译运行:

当然这样使用有点粗暴,还没等别人从共享内存中读走数据就被删除了,下面来让程序更加合理一点从内核删除,当有人读取了共享内存的数据时,会将quit字串写到共享内存的前面四个字节当中,所以在写程序中可以循环来做一个监听,如下:

接下来,修改读取程序:

下面来运行一下:

这时查看一下共享内存是否还存在于内核当中:

另外要注意的一点是:共享内存的前面四个字节的数据类型不一定,可以为整型,也可以为字符串,如下:

目前前四个字节为整型,也可以将数据写入到姓名字段中,将结构体修改一下:

运行效果其实也是一样的,为什么呢,因为我们比较的仅仅只是内存:

只要保证有四个字节的空间,就能够存放四个字符,不在乎是什么数据类型。

linux网络编程之system v共享内存的更多相关文章

  1. linux网络编程之system v信号量(一)

    今天起,学习信号量相关的知识,下面开始: 关于信号量,在前面已经介绍过了,这里回顾一下: 通过上面的描述,很容易就能想到信号量的一上数据结构: 下面再来回顾一下P.V原语: 所谓的原语就是指这段代码是 ...

  2. linux网络编程之system v信号量(二)

    今天迎来元旦假期的最后一天了,过得好快~昨天跟小伙伴们在军都滑雪陪儿爽,虽说上了两回中级道都摔得异常的惨烈,但是在初级道上学习"s"转弯还是有一些小心得,可以在要往高手迈进的前提, ...

  3. linux网络编程之system v消息队列(二)

    今天继续学习system v消息队列,主要是学习两个函数的使用,开始进入正题: 下面则开始用代码来使用一下该发送函数: 在运行之前,先查看一下1234消息队列是否已经创建: 用上次编写的查看消息队列状 ...

  4. linux网络编程之system v消息队列(一)

    经过上次对于进程通讯的一些理论的认识之后,接下来会通过实验来进一步加深对进程通讯的认识,话不多说,进入正题: 其实还可以通过管道,但是,管道是基于字节流的,所以通常会将它称为流管道,数据与数据之间是没 ...

  5. Linux进程通信之System V共享内存

    前面已经介绍过了POSIX共享内存区,System V共享内存区在概念上类似POSIX共享内存区,POSIX共享内存区的使用是调用shm_open创建共享内存区后调用mmap进行内存区的映射,而Sys ...

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

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

  7. 阐述linux IPC(五岁以下儿童):system V共享内存

    [版权声明:尊重原创.转载请保留源:blog.csdn.net/shallnet 要么 .../gentleliu,文章学习交流,不用于商业用途]         system V共享内存和posix ...

  8. Linux system v 共享内存

    system v 共享内存 #include <sys/types.h> #include <sys/shm.h> int shmget(key_t key, size_t s ...

  9. System V 共享内存区

    1.概述 系统调用mmap通过映射一个普通文件实现共享内存.System V 则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信.也就是说,每个共享内存区域对应特殊文件系统shm中的一个文 ...

随机推荐

  1. [US Open 2004][luogu2342] 叠积木 [带权并查集]

    题面 洛谷传送门 思路 害 学了4年多OI,第一次知道还有带权并查集这个东西 wtcl 这个玩意儿的原理和详细实现,可以参考这个博客:带权并查集传送门 这道题,就是在带权并查集的基础上,加个维护每个集 ...

  2. OneNote中更改英文输入默认不是微软雅黑的问题

    win10下的终极版解决方案: 1.进入C:\Windows\Fonts找到Calibri字体,点进去后先右键Calibri常规-属性-安全-高级,将所有者从“TrustedInstaller”更改为 ...

  3. KEGG富集分析散点图.md

    输入数据格式 pathway = read.table("kegg.result",header=T,sep="\t") pp = ggplot(pathway ...

  4. RedHat Linux下普通用户无法使用sudo命令的解决方法

    Ref:http://blog.sina.com.cn/s/blog_4aa35ca101012qb6.html 装完linux系统,发现普通用户无法使用sudo 命令, 提示:User1(普通用户) ...

  5. 034 Android NavigationView和DrawerLayout实现抽屉式导航设计(侧边栏效果)

    1.创建带侧滑效果的activity 右击,new---->activity---->选择NavgationDrawer Activity 2.xml文件布局 (1)activity_ma ...

  6. scau 10692 XYM-入门之道

    题目:http://paste.ubuntu.com/14157516/ 思路:判断一个西瓜,看看能不能直接吃完,如果能,就吃了.但是:如果不能,就要分成两半,就这样分割,不用以为要用到n维数组,用一 ...

  7. Session中清除对象方法比较

    转载. https://blog.csdn.net/u014401141/article/details/51816308 Session中清除对象方法比较   http://blog.csdn.ne ...

  8. 【Docker】:全面认识Docker和基本指令

    Docker逐渐成为虚拟化技术的佼佼者,接下来会推出一系列的Docker相关技术文章,Docker技术也是架构师的必备技能. 什么是Docker Docker 是一个开源的应用容器引擎,基于Go语言, ...

  9. WUSTOJ 1346: DARK SOULS(Java)并查集

    题目链接:1346: DARK SOULS 并查集系列:WUSTOJ 1319: 球(Java)并查集 Description CQ最近在玩一款游戏:DARK SOULS,这是一款以高难度闻名的硬派动 ...

  10. Python yield 使用浅析【转】

    Python yield 使用浅析 IBM developerWorks 中国 : Open source IBM 开源 - IBM Developer 中国 (原 developerWorks 中国 ...