C 将内存映射到文件描述符的系统调用(逆mmap)?

C 将内存映射到文件描述符的系统调用(逆mmap)?,c,unix,posix,mmap,system-calls,C,Unix,Posix,Mmap,System Calls,我希望能够将内存映射到文件描述符,以便可以使用一些需要文件描述符的现有函数。以下是我想要的: void do_operation1(int fd); char data[DATA_MAX] = { /* embedded binary data */ }; int fd = addr_to_fd(data, DATA_MAX); do_operation1(fd); /* ... operate on fd ... */ 我可以使用什么系统调用来完成此任务?某些实现具有fmemopen()

我希望能够将内存映射到文件描述符,以便可以使用一些需要文件描述符的现有函数。以下是我想要的:

void do_operation1(int fd);

char data[DATA_MAX] = { /* embedded binary data */ };
int fd = addr_to_fd(data, DATA_MAX);

do_operation1(fd);
/* ... operate on fd ... */

我可以使用什么系统调用来完成此任务?

某些实现具有
fmemopen()
。(当然,您必须调用
fileno()


如果没有,您可以使用
fork()
pipe()
自己构建它。您应该查看
shm_open()

当然,只需
打开(argv[0],…)
,扫描文件以找到二进制数据的起始位置,
lseek()
,然后完成。该文件当然没有二进制数据的长度。

文件*
来自
fmemopen
或类似文件时,
fileno()
在Linux/FreeBSD(我认为其他)上都会失败。如果无法获取文件描述符,我不确定我们是否有解决方案。
fmemopen
也可以在BSD上使用
funopen
实现。
fork()中提供了一个实现。
对于这一目的来说相当重要。我建议用线代替。使用
select()
在从管道读取和写入之间进行多路复用会更好,但我想这不是一个选项。这不起作用,因为
fmemopen()
只创建一个由给定内存缓冲区支持的
文件*
。没有创建文件描述符。