系统编程三(共享内存)

本文介绍了POSIX共享内存的分类、接口和相关函数,包括内存映射文件、匿名内存映射以及创建、删除、建立内存映射和关闭内存映射的操作。还探讨了实际应用中的匿名内存映射(亲缘和非亲缘进程)以及使用mmap可能遇到的问题和解决方案。
摘要由CSDN通过智能技术生成

什么是共享内存

在这里插入图片描述

1.POSIX 共享内存

查看:

man shm_overview
ls /dev/shm

1.1分类

1.内存映射文件:
在这里插入图片描述
注意:共享内存大小 = 文件大小

2.匿名内存映射(亲缘进程)

风格 方式
BSD MAP_ANON+mmap()
Systerm V /dev/zero+open()

3.共享内存区对象(非亲缘进程)
在这里插入图片描述

1.2 接口

头文件:sys/mman.h
库:rt

1.3 函数

POSIX 共享内存有5个函数

操作 函数
创建 int shm_open(const char *name, int oflag, mode_t mode)
删除 int shm_unlink(const char *name)
建立内存映射 void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset)
关闭内存映射 int munmap(void *start,size_t length)

此外,在使用内存映射文件,经常要用到以下两个文件操作函数:

操作 函数
获取文件信息 int fstat(int fd,struct stat *buf)
修改文件大小 int ftruncate(int fd, off_t length)

说明:
获取文件信息函数:fstat

int fstat(int fd,struct stat *buf);

参数说明:

参数 含义
fd 文件描述描述符
buf struct stat

struct stat说明:

参数 含义
st_mode 权限
st_size 大小
st_uid 属主ID
st_guid 组ID

返回值说明:

返回值 含义
-1 出错
0 成功

示例:
编写一个命令行程序,获取文件的大小

#include <stdio.h>
#include <unistd.h>
#include <string.h>
 
int main(int argc,char* argv[]){
    int fd = open(argv[1],O_RDONLY,0644);		//编译后 ./a.out 后面跟打开文件名
    struct stat file_stat;			//stat是系统定义的一个结构体,里面定义了文件的属性
    fstat(fd,&file_stat);
    //stat(argv[1],&file_stat);		//stat的第一个参数为文件名,而不是文件描述符,效果相同
    printf("file :%s size: %d",argv[1],file_stat.st_size);
    return 0;
}

修改文件大小函数:ftruncate

int ftruncate(int fd, off_t  length)

参数说明:

参数 含义
fd 文件描述符
length 文件大小,如果原来的文件大小比参数length大,超过的部分删除
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值