使用内存文件映射实现共享内存

不使用IPC中的共享内存(shm),使用内存文件映射的方式来实现共享内存

共享内存写入者:

// 使用文件内存映射进行内存共享
#include <iostream>
#include <string>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
using namespace std;

// 用户自定义的一个数据结构
struct user_st
{
    int len;
    char buffer[2048];
};

// 共享内存写入者
int Writer(int argc, char** argv)
{
    int fd;
    user_st * use_data;

    // 创建并打开一个文件(如果文件存在那么清空它),用于内存共享
    fd=open(argv[1],O_CREAT|O_RDWR|O_TRUNC,00777);

    // 移动文件指针
    lseek(fd,sizeof(user_st)-1,SEEK_SET);

    // 往文件中写入数据,目的是为了让文件产生这么长的空间,否则写入读取的时候会出现错误
    write(fd,"",1);

    // 进行内存映射,注意参数:PROT_READ|PROT_WRITE表示可读写,MAP_SHARED表示映射内存用于共享
    use_data = (user_st*) mmap( NULL,sizeof(user_st),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0 );

    // 关闭文件描述符(注意,虽然文件描述符关闭了,但是映射的内存仍然可用)
    // 因为在mmap的内部会增加文件对象的引用计数
    close( fd );

    // 往共享内存中写入数据
    strcpy(use_data->buffer,"hello world!");

    printf("Write data to Shared Memory!\n");

    sleep(10);

    // 卸载内存文件映射
    munmap(use_data,sizeof(user_st));

    return 0;
}

int main(int argc, char** argv) // map a normal file as shared mem:
{
    return Writer(argc,argv);
}

共享内存读取者:

// 使用文件内存映射进行内存共享
#include <iostream>
#include <string>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
using namespace std;

// 用户自定义的一个数据结构
struct user_st
{
    int len;
    char buffer[2048];
};

// 共享内存读取者
int Reader(int argc, char** argv)
{
    int fd;

    user_st *use_data;

    // 打开文件
    fd=open( argv[1],O_CREAT|O_RDWR,00777 );

    // 进行内存映射,映射的大小是sizeof(user_st)
    use_data = (user_st*)mmap(NULL,sizeof(user_st),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

    // 关闭文件
    close(fd);

    // 读取共享内存
    printf( "buffer: %s;\n",use_data->buffer );

    // 卸载内存映射
    munmap( use_data,sizeof(user_st) );
}

int main(int argc, char** argv) // map a normal file as shared mem:
{
    return Reader(argc,argv);
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi中的内存映射共享数据是一种在不同进程之间共享数据的方法。它允许多个进程访问同一块内存区域,以实现数据的共享和交互。 在Delphi中,可以使用TMemoryMappedFile和TMemoryMappedView来实现内存映射共享数据。首先,使用TMemoryMappedFile创建一个内存映射文件,并指定文件的名称和大小。然后,使用TMemoryMappedView来创建一个内存映射视图,将内存映射文件加载到当前进程的内存中。 一旦内存映射文件被加载到内存中,不同进程可以通过该文件进行数据的读写操作。每个进程可以将数据写入内存映射视图中的指定位置,并通过内存地址进行数据访问。当一个进程修改了内存映射视图中的数据后,其他进程也可以看到这些改变。 使用内存映射共享数据的好处是可以提高进程间通信的效率和速度。相比于其他通信方式如管道或消息队列,内存映射共享数据可以直接在内存中读写数据,避免了数据的拷贝和传输,提高了数据的访问速度。 当然,使用内存映射共享数据也需要注意一些问题。由于多个进程可以同时访问和修改数据,需要进行合理的同步和互斥操作,以避免数据的竞争和冲突。此外,对于不同的数据类型和结构,需要正确地定义和解释数据的格式和布局,以确保不同进程之间的数据共享和解析的一致性。 总而言之,Delphi中的内存映射共享数据是一种高效、灵活的进程间通信方式,可以实现数据的共享和交互。通过合理的设计和操作,可以实现进程间数据的高速读写和同步,满足不同应用场景的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值