Linux开发:通过memfd_create创建一个内存文件

96 篇文章 3 订阅 ¥99.90 ¥99.00

memfd_create提供了一个方法,可以在内存中创建一个匿名文件,但是这个文件在真实的文件系统中却不存在。

#define _GNU_SOURCE
#include <sys/mman.h>
int memfd_create(const char *name, unsigned int flags);

参数:

        name:文件的名字

        flags:常用参数为MFD_CLOEXEC,在调用execv时会自动关闭

#include <sys/mman.h>
#include <unistd.h>
#include <string>
#include <iostream>

using namespace std;
int main()
{
    int fd = memfd_create("mem_file", 0);
    if(fd < 0)
    {
        cout << "memfd_create failed" << endl;
        return -1;
    }
    cout << "create fd:" << fd <<endl;

    string s = "hello";
    write(fd, s.c_str(), s.length());

    char buf[100] = {0};
    lseek(fd, 0, SEEK_SET);
    read(fd, buf, sizeof(buf));
    
    cout << "read from file:" <&l
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是一个简单的 C 语言代码示例,演示如何在两个进程中使用 `memfd_create` 创建文件句柄进行进程间通信: ```c // 进程 A #include <stdio.h> #include <unistd.h> #include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main() { // 在进程 A 中创建一个匿名的文件描述符 int memfd = memfd_create("sharedmem", 0); if (memfd == -1) { perror("memfd_create"); return 1; } // 设置文件描述符的大小 if (ftruncate(memfd, 4096) == -1) { perror("ftruncate"); return 1; } // 在进程 A 中映射该文件描述符到内存中 void *addr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, memfd, 0); if (addr == MAP_FAILED) { perror("mmap"); return 1; } // 在进程 A 中写入数据到共享内存中 sprintf((char*)addr, "Hello from process A"); // 将文件描述符的值发送给进程 B printf("Sending file descriptor %d to process B...\n", memfd); if (write(STDOUT_FILENO, &memfd, sizeof(memfd)) == -1) { perror("write"); return 1; } // 等待进程 B 读取共享内存中的数据 printf("Waiting for process B...\n"); sleep(5); // 取消映射文件描述符 if (munmap(addr, 4096) == -1) { perror("munmap"); return 1; } // 关闭文件描述符 if (close(memfd) == -1) { perror("close"); return 1; } return 0; } ``` ```c // 进程 B #include <stdio.h> #include <unistd.h> #include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main() { // 从进程 A 中读取文件描述符的值 int memfd; printf("Waiting for file descriptor from process A...\n"); if (read(STDIN_FILENO, &memfd, sizeof(memfd)) == -1) { perror("read"); return 1; } // 在进程 B 中创建一个匿名的文件描述符 int memfd2 = memfd_create("sharedmem2", 0); if (memfd2 == -1) { perror("memfd_create"); return 1; } // 设置文件描述符的大小 if (ftruncate(memfd2, 4096) == -1) { perror("ftruncate"); return 1; } // 在进程 B 中映射该文件描述符到内存中 void *addr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, memfd2, 0); if (addr == MAP_FAILED) { perror("mmap"); return 1; } // 在进程 B 中从共享内存中读取数据,并将其打印出来 printf("Message from process A: %s\n", (char*)addr); // 在进程 B 中写入数据到共享内存中 sprintf((char*)addr, "Hello from process B"); // 取消映射文件描述符 if (munmap(addr, 4096) == -1) { perror("munmap"); return 1; } // 关闭文件描述符 if (close(memfd) == -1) { perror("close"); return 1; } if (close(memfd2) == -1) { perror("close"); return 1; } return 0; } ``` 这个示例中,进程 A 和进程 B 都使用 `memfd_create` 创建了一个匿名的文件描述符,并将其映射到内存中。进程 A 向进程 B 发送文件描述符的值,进程 B 接收到文件描述符后,创建一个新的匿名文件描述符,并将其映射到内存中。进程 B 从共享内存中读取进程 A 写入的数据,并将自己的数据写入到共享内存中,然后关闭文件描述符。最后,进程 A 等待进程 B 处理完共享内存中的数据,然后也关闭文件描述符。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风静如云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值