- 专栏内容:linux下并发编程
- 个人主页:我的主页
- 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.
目录
前言
概述
原理
接口
代码演示
结尾
前言
本专栏主要分享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
结尾
作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。另外有什么想要了解的内容,也可以给我发邮件,互相谈讨,定知无不言。
注:未经同意,不得转载!