linux 匿名文件 memfd_create

  


目录

前言

概述

原理

接口

代码演示

结尾


前言

本专栏主要分享linux下并发编程相关知识,包括多进程,多线程,进程/线程间通信,并发同步控制,以及高并发下性能提升,请大家多多留言。


概述

本专栏已经分享共享内存,文件映射,匿名/命名管道,消息队列等四种进程间通信的方式,本文来介绍第五种方式,而且非常特别,且看本文分解。

原理

linux系统调用 memfd_create提供了一种创建匿名内存文件的方式,类似于tmpfs。这种方式创建的文件,使用与常规文件一样,但是内容只在内存中,没有对应的磁盘文件。这与共享内存的区别是,共享内存是固定大小,而匿名文件是与常规文件一样可以追加扩展,直到内存不足。

匿名文件在引用为零时自动删除。

进程间通信时,需要传递fd,有几种方式,(1)fork产生的父子进程间,进程空间的拷贝;(2)通过unix socket进行传递,然后用mmap映射后使用;(3)通过查看/proc/pid/fd/(fd)关联,第二个进程调用memfd_create进行打开。

[senllang@localhost createfd]$ ll /proc/54975/fd/

total 0

lrwx------. 1 senllang develops 64 Apr 15 19:25 0 -> /dev/pts/5

lrwx------. 1 senllang develops 64 Apr 15 19:25 1 -> /dev/pts/5

lrwx------. 1 senllang develops 64 Apr 15 19:25 2 -> /dev/pts/5

lrwx------. 1 senllang develops 64 Apr 15 19:25 3 -> '/memfd:shm (deleted)'

接口

/* 头文件,还有GUN宏定义 */

#define _GNU_SOURCE

#include <sys/mman.h>

/* 创建匿名文件 */

int memfd_create(const char *name, unsigned int flags);

参数name, 指定一个待创建文件名,会在/proc/self/fd下进行关联;

flags, 可以取值

MFD_CLOEXEC,在调用execv时会自动关闭;

MFD_ALLOW_SEALING,打开“密封”时,可以对文件进行一些配置,如使用ftruncate设置大小,还可以用fcntl 的F_ADD_SEALS选项,设置可写F_SEAL_WRITE,大小可收缩F_SEAL_SHRINK,可扩展F_SEAL_GROW。

MFD_HUGETLB,创建使用大页内存

其它接口read/write/seek/close用法与普通文件一样;

代码演示

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

int main(int argc ,char** argv)
{
   int fd = -1;
   char buf[] = "hello memfd_create";
   char rbuf[1024] ;

   //获取文件描述符
   fd = memfd_create("shm",0);
   if(fd < 0)
   {
       printf("memfd_create error[%s]\n",strerror(errno));
       return -1;
   }
   printf("create fd:%d\n",fd);

   write(fd, buf, sizeof(buf));
   lseek(fd,strlen(buf) , SEEK_SET);
   write(fd, buf, sizeof(buf));

   memset(rbuf, 0x00, sizeof(rbuf));
   lseek(fd, 0, SEEK_SET);
   read(fd, rbuf, 1024);

   printf("read %s\n", rbuf);

   close(fd);
   return 0;
}

运行结果如下:

[senllang@localhost createfd]$ gcc memfd_ex02.c
[senllang@localhost createfd]$ ./a.out
create fd:3
read hello memfd_createhello memfd_create
 


结尾

作者邮箱:[email protected]
如有错误或者疏漏欢迎指出,互相学习。另外有什么想要了解的内容,也可以给我发邮件,互相谈讨,定知无不言。

注:未经同意,不得转载!

猜你喜欢

转载自blog.csdn.net/senllang/article/details/130187652