文档章节

C语言共享内存

明天以后
 明天以后
发布于 2017/09/01 11:06
字数 779
阅读 47
收藏 1
点赞 0
评论 0

共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。

参考资料:

共享内存

linux进程间的通信(C): 共享内存

共享内存特点

  • 共享内存是进程间共享数据最快的方法

    一个进程向共享内存写入数据,共享这个内存区域的所有进程就可以立即看到其中的内容。

  • 使用共享内存需要注意的是多进程之间对一个给定存储区访问的互斥

    若一个进程正在向共享区写数据,则在它操作完成之前,其他的进程不应当去读、写这些数据。

示例代码如下

memShareWrite.c

//
// IPC--共享内存(写数据)
// Created by 卢鹏 on 2017/8/31.
//
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

// 共享内存大小
#define BUFFSIZE 1024

int main(int argc, char *argv[]) {
    // 共享内存的shmid
    int shmid;
    // 共享内存的key
    key_t key;
    char *shmadd;
    char *msg;

    // 创建共享内存的key
    if ((key = ftok("./", 2015)) == -1) {
        perror("ftok error");
    }

    // 创建共享内存
    if ((shmid = shmget(key, BUFFSIZE, IPC_CREAT|0666)) < 0) {
        perror("shmget error.");
        exit(-1);
    }
    printf("Create shared-memory success, with shmid: %d\n", shmid);

    // 映射
    if ((shmadd = shmat(shmid, NULL, 0)) < 0) {
        perror("shmat error.");
        exit(-1);
    }

    // 拷贝共享数据到共享内存
    printf("copy data to shared-memory\n");
    bzero(shmadd, BUFFSIZE);
    msg = "hello, yj.";
    strcpy(shmadd, msg);
    printf("copy data to shared-memory success, with msg: %s\n", msg);
}

memShareRead.c

//
// IPC--共享内存(读数据)
// Created by 卢鹏 on 2017/8/31.
//

#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFFSIZE 1024

int main(int args, char *argv[]) {
    int shmid;
    int ret;
    key_t key;
    char *shmadd;

    // 创建key值
    if ((key = ftok("./", 2015)) == -1) {
        perror("ftok error.");
    }

    // 查看系统共享内存
    printf("start-ipcs------------------------------------------\n");
    system("ipcs -m");
    printf("end-ipcs--------------------------------------------\n");

    // 打开共享内存
    if ((shmid = shmget(key, BUFFSIZE, IPC_CREAT|0666)) < 0) {
        perror("shmget error.");
        exit(-1);
    }
    printf("Open shared-memory success, with shmid: %d\n", shmid);

    // 映射
    if ((shmadd = shmat(shmid, NULL, 0)) < 0) {
        perror("shmat error.");
        exit(-1);
    }

    // 读取共享内存中的数据
    printf("read data from shared-memory\n");
    printf("%s\n", shmadd);

    // 分离共享内存和当前进程
    if ((ret = shmdt(shmadd)) < 0) {
        perror("shmdt error.");
        exit(1);
    } else {
        printf("Delete shared-memory\n");
    }

    // 删除共享内存
    shmctl(shmid, IPC_RMID, NULL);

    // 查看系统共享内存
    printf("start-ipcs------------------------------------------\n");
    system("ipcs -m");
    printf("end-ipcs--------------------------------------------\n");

    return 0;
}

运行结果

➜ gcc memShareWrite.c -o w
➜ gcc memShareRead.c -o w
➜ chmod +x w
➜ chmod +x r
➜ 
➜
➜ ./w    
Create shared-memory success, with shmid: 327680
copy data to shared-memory
copy data to shared-memory success, with msg: hello, yj.

➜
➜
➜ ./r 
start-ipcs------------------------------------------
IPC status from <running system> as of Fri Sep  1 11:03:18 CST 2017
T     ID     KEY        MODE       OWNER    GROUP
Shared Memory:
m 327680 0xdf041eec --rw-rw-rw-   lpe234    staff

end-ipcs--------------------------------------------
Open shared-memory success, with shmid: 327680
read data from shared-memory
hello, yj.
Delete shared-memory
start-ipcs------------------------------------------
IPC status from <running system> as of Fri Sep  1 11:03:18 CST 2017
T     ID     KEY        MODE       OWNER    GROUP
Shared Memory:

end-ipcs--------------------------------------------


最后

但在实际编程中,应该使用信号量,或通过传递消息(使用管道或IPC消息),或生成信号的方法来提供读写之间的更有效的同步机制。

© 著作权归作者所有

共有 人打赏支持
明天以后
粉丝 72
博文 121
码字总数 81669
作品 0
昌平
程序员
Go和C如何共享内存资源

Go语言作为一个现代化的编程语言以及支持垃圾内存的自动回收特性(GC).我们现在关注的是C语言返回的内存资源的自动回收技术. CGO初步 Go语言的cgo技术允许在Go代码中方便的使用C语言代码. 基本...

chai2010 ⋅ 2013/10/13 ⋅ 2

System.IO之内存映射文件共享内存

内存映射文件是利用虚拟内存把文件映射到进程的地址空间中去,在此之后进程操作文件,就像操作进程空间里的地址一样了,比如使用c语言的memcpy等内存操作的函数。这种方法能够很好的应用在需...

长平狐 ⋅ 2012/06/08 ⋅ 0

关于如何更深度理解C之Volatile关键字

据我所知,在C语言中的volatile关键字,主要用在4个地方上。 1、 在内存中进行地址映射的设备寄存器 2, 在中断处理程序中可能被修改的全局变量 3, 多线程应用程序中的全局变量 4, 多进程应...

daleshen128 ⋅ 2012/12/15 ⋅ 3

PostgreSQL 共享缓存代码分析交流讲座

PostgreSQL 共享缓存代码分析交流讲座 方式:在线交流,使用QQ群语音。 时间:2013年12月17日晚8点开始。 交流之前,如果有如下准备更佳: 1、PostgreSQL v9.3.2源代码(或者9.0及更高版本,...

有理想的猪 ⋅ 2013/12/12 ⋅ 1

c语言怎么生成唯一的序列

c语言中,一个守护进程,在不设置int类型全局变量,也不能用时间(包括秒和毫秒)做种子调用rand()生成的伪随机情况下 怎么生成唯一序列码?rand既然叫伪随机,那有真随机的函数么? 还有,...

陈舵主 ⋅ 2013/01/04 ⋅ 9

C 语言编写的内存数据库 - STVM

STVM(truck of Virtual memory table)是一个开源的使用ANSI C语言编写、支持本地API调用和网络调用,全表数据基于IPC共享内存方式存储, 基于C语言struck结构定义记录行,RB-Tree和hash作为...

DeffPuzzL ⋅ 03/02 ⋅ 1

Linux进程间通信之共享内存

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

duanjiatao ⋅ 2016/08/01 ⋅ 0

C语言共享内存使用思路利用结构体

这里不介绍如何创建共享内存,如果想知道百度一下就好了。只介绍一下如何使用这一段连续的共享内存空间。思路就是利用结构体。 创建一个结构体,它的大小可以用sizeof()获取。注意这里有一...

kangxin1234 ⋅ 2015/09/28 ⋅ 0

python中全局变量、局部变量、类变量、实例变量简析

因为python为动态语言,处理变量的方式与一些静态语言(比如C++)不大一样,在这里对这些变量进行小小的总结 python中全局变量与C语言中类似,也就是在的那个单页面所有函数外头定义的变量 局部...

爱吃橘子 ⋅ 2017/12/18 ⋅ 0

Open MP 模板库20090405发布

OpenMP是由OpenMP Architecture Review Board牵头提出的,并已被广泛接受的,用于共享内存并行系统的多线程程序设计的一套指导性注释(Compiler Directive)。OpenMP支持的编程语言包括C语言、...

老枪 ⋅ 2009/04/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vue使用mockjs

在使用vue开发的时候,一直疑惑与mockjs怎么用,开了mockjs的开发文档,还是一脸蒙蔽,无从下手!mockjs在前后端分离开发上进行模拟数据,是不可避掉的一环。在网上看了一些博文还有查阅了其...

JamesView ⋅ 18分钟前 ⋅ 0

解决问题的思路

1.相对来说,程序逻辑解决问题的思路应该更加趋向于通过逻辑结构来解决问题,而不是通过更小的类级别和方法级别的改进 2.类级别和方法级别的改进需要的技术能力更高一点

th778899 ⋅ 25分钟前 ⋅ 0

HTTP请求状态及jQuery AJAX请求异常处理

上一周调优一个项目的Js部分,其中一个严重的问题就是在页面初始化数据时,没有对异常进行处理, 导致Loading一直在等待中,无提示无处理。在用户体验上很不好,即使网络条件无法保证,在出错...

临江仙卜算子 ⋅ 25分钟前 ⋅ 0

error code 1874. innodb is in read only mode--报错解决

参考网页 https://zhidao.baidu.com/question/746894876932022292.html https://blog.csdn.net/shushugood/article/details/80226767 问题背景 创建了一个数据库然后想删除,因为自己本机性能......

karma123 ⋅ 26分钟前 ⋅ 0

JVM系列:jinfo命令详解

jinfo全称Java Configuration Info,主要作用是实时查看和调整JVM配置参数。 一.查看JVM参数 用法:jinfo -flag <name> PID 示例: # jinfo -flag MaxMetaspaceSize 11180 # -XX:MaxMetaspac......

Jacktanger ⋅ 31分钟前 ⋅ 0

exportfs命令、NFS客户端问题、FTP介绍、使用vsftpd搭建ftp

1. exportfs命令 一般情况下重启服务器上nfs服务时,需把客户端上的挂载先卸载掉,以免进程后面杀不掉。当客户端服务器很多时,操作起来就比较麻烦。此时可以使用exportfs命令重新加载下。 ...

laoba ⋅ 40分钟前 ⋅ 0

基于Python的信用评分卡模型分析

信用风险计量体系包括主体评级模型和债项评级两部分。主体评级和债项评级均有一系列评级模型组成,其中主体评级模型可用“四张卡”来表示,分别是A卡、B卡、C卡和F卡;债项评级模型通常按照主...

火力全開 ⋅ 41分钟前 ⋅ 0

执行make命令时报错g++: Command not found

执行make命令时报错g++: Command not found 2016年10月24日 12:31:29 阅读数:4366 朋友安装node时遇到的问题 报错截图: 其实很简单只需要安装一下 yum -y install gcc automake autoconf l...

rootliu ⋅ 41分钟前 ⋅ 0

Loongnix(龙芯)系统,优盘安装指南

U盘安装分为两种方式:"usb disk" 及 "usb cd"。其中usb cd是将usb disk做为usb光驱使用。 usb disk安装步骤: 需要准备一个大小超过3.5G的U盘,格式化ext3格式 下载安装光盘镜像xxx.iso,将...

gugudu ⋅ 45分钟前 ⋅ 0

HTML5中meta属性的使用详解

meta属性在HTML中占据了很重要的位置。如:针对搜索引擎的SEO,文档的字符编码,设置刷新缓存等。虽然一些网页可能没有使用meta,但是作为正规军,我们还是有必要了解一些meta的属性,并且能...

guorongjin ⋅ 48分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部