L5进程、线程和进程间通信--共享内存(day7)

本文详细介绍了Linux中使用mmap进行共享内存的基本使用,包括内存映射的概念、mmap函数的优缺点及定义,以及如何通过mmap实现进程间通信。此外,还提到了System V共享内存的使用步骤和关键函数,如ftok、shmget、shmat、shmdt和shmctl。最后,作业要求实现两个进程通过内存映射进行通信的程序。
摘要由CSDN通过智能技术生成

目录

一、共享内存的基本使用

一、内存映射

1、概念

2、mmap()的优点:

 4、函数定义

二、共享内存实现进程间通信

 三、mmap()映射的种类

 四:System V共享内存

共享内存: 

共享内存使用步骤:

1.key

共享内存创建 – shmget

共享内存映射 – shmat

 共享内存撤销映射 – shmdt

共享内存控制 – shmctl(删除共享内存)

作业:自己实现两个进程使用内存映射通信程序,并提交实验截图


一、共享内存的基本使用

一、内存映射

1、概念

共享内存可以通过mmap()映射普通文件,
使一个磁盘文件与内存中的一个缓冲区相映射,进程可以像访问普通内存一样对文件进行访问,不必再调用read,write。

2、mmap()优点

实现了用户空间和内核空间的高效交互方式

 

 

 4、函数定义

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);        
功能:创建共享内存映射
函数返回值:成功返回创建的映射区首地址,失败返回MAP_FAILED( ((void *) -1) ),设置errno值
参数说明:
addr:指定要映射的内存地址,一般设置为 NULL 让操作系统自动选择合适的内存地址。
length:必须>0。映射地址空间的字节数,它从被映射文件开头 offset 个字节开始算起。
prot:指定共享内存的访问权限。可取如下几个值的可选:PROT_READ(可读), PROT_WRITE(可写), PROT_EXEC(可执行), PROT_NONE(不可访问)。
flags:由以下几个常值指定:MAP_SHARED(共享的) MAP_PRIVATE(私有的), MAP_FIXED(表示必须使用 start 参数作为开始地址,如果失败不进行修正),其中,MAP_SHARED , MAP_PRIVATE必选其一,而 MAP_FIXED 则不推荐使用。MAP_ANONYMOUS(匿名映射,用于血缘关系进程间通信)
fd:表示要映射的文件句柄。如果匿名映射写-1。
offset:表示映射文件的偏移量,一般设置为 0 表示从文件头部开始映射。

mmap_w.c:

#include <sys/mman.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


int main(){
    
    void *addr;
    int fd;
    fd =open("test",O_RDWR);// 当MAP_SHARED时,要求:映射区的权限应 <=文件打开的权限
    if(fd<0){
        perror("open");
        return 0;
    }
    //int len = lseek(fd,0,SEEK_END);    
    addr = mmap(NULL,100, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    if(addr == MAP_FAILED){//映射失败
        perror("mmap");
        return 0;
    }
	//memcpy(addr,"abcdefg",7);
	printf("read=%s\n",(char*)addr);
    close(fd);
   /* int i=0;
    while(i<2048){
        memcpy((addr+i),"a",1);
        i++;
        sleep(1);
    }    
//    printf("read=%s\n",(char*)(addr));

*/
}

结果:

 

注意事项:
(1) 创建映射区的过程中,隐含着一次对映射文件的读操作,将文件内容读取到映射区。
(2) 当MAP_SHARED时,要求:映射区的权限应 <=文件打开的权限(出于对映射区的保护),如果不满足报非法参数(Invalid argument)错误。
当MAP_PRIVATE时候,mmap中的权限是对内存的限制,只需要文件有读权限即可,操作只在内存有效,不会写到物理磁盘,且不能在进程间共享。
(3) 映射区的释放与文件关闭无关,只要映射建立成功,文件可以立即关闭。
(4) 用于映射的文件大小必须>0,当映射文件大小为0时,指定非0大小创建映射区,访问映射地址会报总线错误,指定0大小创建映射

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值