POSIX共享内存函数介绍

shm_open

功能:
用来创建或打开一个共享内存对象
原型:
int shm_open(const char *name, int oflag, mode_t mode);
参数:
name : 共享内存对象的名字(命名规则和POSIX消息队列一样)
oflag :与open函数类似,可以是O_RDONLY、O_WRONLY、O_RDWR,还可以按位或上O_CREAT、O_EXCL、O_TRUNC等
mode : 此参数总是需要设置,如果oflag没有指定O_CREAT,可以指定为0 返回值:
成功 : 成功返回非负整数文件描述符
失败 : -1

ftruncate

功能:
修改共享内存的大小(还可以用来修改文件的大小)
原型:
int ftruncate(int fd, off_t length);
参数:
fd : 文件描述符
length :长度 返回值:
成功 : 0
失败 : -1

fstat

功能:
获取共享内存对象信息(还可以用来获取文件的信息)
原型:
int fstat(int fd, struct stat *buf);
参数:
fd : 文件描述符
buf :返回共享内存状态 返回值:
成功 : 0
失败 : -1

shm_unlink

功能:
删除共享内存对象
原型:
int shm_unlink(const char *name);
参数:
name : 共享内存对象的名字 返回值:
成功 : 0
失败 : -1

mmap

功能:
将共享内存对象映射到进程地址空间
原型:
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
参数:
addr : 要映射的起始地址,通常指定为NULL,让内核自动选择
length : 映射到进程地址空间的字节数
prot : 映射区保护方式
flags : 标志
fd : 文件描述符
offset : 从文件头开始的偏移量 返回值:
成功 : 成功返回映射到的内存的起始地址
失败 : -1

POSIX共享内存示例

  共享内存已经自动挂载到/dev/shm目录下

shm_open.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h> /* For mode constants */
#include <fcntl.h> /* For O_* constants */
#include <sys/types.h> #define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while (0) typedef struct stu{
char name[32];
int age;
}STU; int main(int argc, char const *argv[])
{ int shmid;
//创建一个共享内存
//创建的时候指定的权限是0666,创建后不一定是666,它还取决于umask,公式 mode & ~umask
shmid = shm_open("/xyz", O_CREAT|O_RDWR, 0666);
if(shmid == -1)
ERR_EXIT("shm_open"); printf("shm_open success\n"); //改变共享内存的大小
if(ftruncate(shmid,sizeof(STU)) == -1)
ERR_EXIT("ftruncate"); //获取共享内存的信息
struct stat buf;
if(fstat(shmid, &buf) == -1)
ERR_EXIT("fstat"); printf("size : %ld mode : %o\n",buf.st_size, buf.st_mode & 0777); close(shmid);
return 0;
}

shm_write.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h> /* For mode constants */
#include <fcntl.h> /* For O_* constants */
#include <sys/types.h> #define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while (0) typedef struct stu{
char name[32];
int age;
}STU; int main(int argc, char const *argv[])
{ int shmid;
//创建一个共享内存 shmid = shm_open("/xyz", O_RDWR, 0);
if(shmid == -1)
ERR_EXIT("shm_open"); printf("shm_open success\n"); //获取共享内存的信息
struct stat buf;
if(fstat(shmid, &buf) == -1)
ERR_EXIT("fstat"); STU *p;
//如果指定了PROT_WRITE和MAP_SHARED,shm_open的oflag应该指定为O_RDWR,否则会出现mmap: Permission denied
p = mmap(NULL, buf.st_size, PROT_WRITE, MAP_SHARED, shmid, 0);
if(p == MAP_FAILED)
ERR_EXIT("mmap"); strcpy(p->name, "test");
p->age = 20; close(shmid);
return 0;
}

shm_read.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/stat.h> /* For mode constants */
#include <fcntl.h> /* For O_* constants */
#include <sys/types.h> #define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while (0) typedef struct stu{
char name[32];
int age;
}STU; int main(int argc, char const *argv[])
{ int shmid;
//创建一个共享内存 shmid = shm_open("/xyz", O_RDONLY, 0);
if(shmid == -1)
ERR_EXIT("shm_open"); printf("shm_open success\n"); //获取共享内存的信息
struct stat buf;
if(fstat(shmid, &buf) == -1)
ERR_EXIT("fstat"); STU *p;
//如果指定了PROT_WRITE和MAP_SHARED,shm_open的oflag应该指定为O_RDWR,否则会出现mmap: Permission denied
p = mmap(NULL, buf.st_size, PROT_READ, MAP_SHARED, shmid, 0);
if(p == MAP_FAILED)
ERR_EXIT("mmap"); printf("name : %s\n", p->name);
printf("age : %d\n", p->age); close(shmid);
return 0;
}

shm_unlink.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h> /* For mode constants */
#include <fcntl.h> /* For O_* constants */ #define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while (0) int main(int argc, char const *argv[])
{ shm_unlink("/xyz");
return 0;
}

第三十五章 POSIX共享内存的更多相关文章

  1. Gradle 1.12用户指南翻译——第三十五章. Sonar 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  2. “全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. “全栈2019”Java第三十五章:面向对象

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  4. 第三十九章 POSIX信号量与互斥锁

    POSIX信号量相关函数 sem_open 功能: initialize and open a named semaphore 原型: sem_t *sem_open(const char *name ...

  5. 【WPF学习】第三十五章 资源字典

    如果希望在多个项目之间共享资源,可创建资源字典.资源字典只是XAML文档,除了存储希望使用的资源外,不做其他任何事情. 一.创建资源字典 下面是一个资源字典示例,它包含一个资源: <Resour ...

  6. 第三十五章 metrics(3)- codahale-metrics基本使用

    <!-- metrics --> <dependency> <groupId>io.dropwizard.metrics</groupId> <a ...

  7. 【第三十五章】 metrics(3)- codahale-metrics基本使用

    <!-- metrics --> <dependency> <groupId>io.dropwizard.metrics</groupId> <a ...

  8. SpringBoot | 第三十五章:Mybatis的集成和使用

    前言 最近收到公众号留言说,单纯的Mybatis的集成和使用.前面在第九章:Mybatis-plus的集成和使用介绍了基于mybatis-plus的集成和使用.后者也只是对mybatis进行了功能增强 ...

  9. 第三十五章 Linux常规练习题(二)参考答案

    一.练习题一 1.删除用户基本组shanghai03.发现无法正常删除,怎样才能将其删除掉,不能删除用户. groupdel shanghai03 移除其所属组的用户 2.打开多个xshell窗口连接 ...

随机推荐

  1. PHP 正则表达式的简单应用以 preg_match_all 抓取HTML元素为例 [转载]

    PHP 正则表达式的简单应用以 preg_match_all 抓取HTML元素为例 2011-12-02 17:09:39|  分类: PHP|举报|字号 订阅     下载LOFTER我的照片书   ...

  2. Forest plot(森林图) | Cox生存分析可视化

    本文首发于“生信补给站”微信公众号,https://mp.weixin.qq.com/s/2W1W-8JKTM4S4nml3VF51w 更多关于R语言,ggplot2绘图,生信分析的内容,敬请关注小号 ...

  3. BERT论文解读

    本文尽量贴合BERT的原论文,但考虑到要易于理解,所以并非逐句翻译,而是根据笔者的个人理解进行翻译,其中有一些论文没有解释清楚或者笔者未能深入理解的地方,都有放出原文,如有不当之处,请各位多多包含,并 ...

  4. [LeetCode] 1108. Defanging an IP Address

    Description Given a valid (IPv4) IP address, return a defanged version of that IP address. A defange ...

  5. MongoDB 学习笔记之 地理空间索引入门

    地理空间索引: 地理空间索引,可用于处理基于地理位置的查询. Point:用于指定所在的具体位置,我们以restaurants为例: db.restaurants.insert({name: &quo ...

  6. 定期从Docker上部署的MySQL备份数据

    前段时间公司停电,正巧赶上周一领导要开会要过一遍项目,然而项目所依赖的MySQL数据库是直接部署在宿主机,且因为各人部署方式不同的原因,花了很久才在开会前启动起来.于是开完会后,我第一件事就是把原先依 ...

  7. 视频转换器 Wondershare Video Converter Ultimate v11.5.1 中文便携版

    Wondershare Video Converter Ultimate 是万兴公司出品的一款多功能音视频转换.DVD 刻录软件.视频下载软件.有了它,您可以随时随地观看.下载.编辑.转换.刻录视频, ...

  8. Dubbo学习系列之十五(Seata分布式事务方案TCC模式)

    上篇的续集. 工具: Idea201902/JDK11/Gradle5.6.2/Mysql8.0.11/Lombok0.27/Postman7.5.0/SpringBoot2.1.9/Nacos1.1 ...

  9. CS231n:Python Numpy教程

    Python 基本数据类型 容器 列表 字典 集合 元组 函数 类 Numpy 数组 访问数组 数据类型 数组计算 广播 SciPy 图像操作 MATLAB文件 点之间的距离 Matplotlib 绘 ...

  10. 一张图一个题帮你迅速理解RLU算法

    下面是某年的软考题: 某进程页面访问序列为4,2,3,1,2,4,5,3,1,2,3,5,且开始执行时内存中没有页面,分配给该进程的物理块数是3,则采用RLU页面置换算法时的缺页率是多少? 对于这个问 ...