2010-05-12 77 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()那裏和做。那個文件當然不會有你的二進制數據的長度。