2010-05-12 42 views
6

我希望能够将内存映射到文件描述符,以便我可以使用一些需要文件描述符的现有函数。这里是我正在寻找的东西:将内存映射到文件描述符(反向mmap)的系统调用?

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 ... */ 

我可以用什么系统调用或调用来完成此操作?

回答

7

某些实现有fmemopen()。 (当然你必须致电fileno())。

如果你的不是,你可以用fork()pipe()自己构建它。

+1

事实证明,当'FILE *'来自'fmemopen'或其他等价物时,'fileno()'在Linux/FreeBSD(以及其他人)上都失败。如果没有获取文件描述符的方法,我不确定我们是否有解决方案。 – 2010-05-21 06:08:31

+1

'fmemopen'也可以使用BSD上的'funopen'来实现。一个实现可以在https://redmine.openinfosecfoundation.org/attachments/105/0001-fmemopen-wrapper-added-fix-compilation-problems-on-m.patch – 2010-05-21 06:09:31

+0

'fork()'是相当重的这个目的。我建议使用线程来代替。使用'select()'来更好地在管道的读写之间进行多路复用,但我想这不是一个选项。 – Sven 2010-09-01 08:40:32

2

当然,只要open(argv[0], ...),扫描通过该文件找到你的二进制数据开始,lseek()那里和做。那个文件当然不会有你的二进制数据的长度。