2010-05-12 12 views
6

Chcę móc map pamięci do deskryptora pliku, aby można było korzystać z niektórych istniejących funkcji, które wymagają deskryptor pliku. Oto zasadniczo co szukam:wywołanie systemowe do odwzorowania pamięci na deskryptor pliku (odwrotność 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 ... */ 

rozmowy Jaki system, lub połączenia, można użyć do osiągnięcia tego celu?

Odpowiedz

7

Niektóre implementacje mają fmemopen(). (Następnie oczywiście musisz zadzwonić pod numer fileno()).

Jeśli twój nie robi, można go zbudować sobie z fork() i pipe().

+1

Okazuje się, że 'fileno()' zawiedzie zarówno Linux/FreeBSD (i przypuszczam innych), gdy plik '*' 'fmemopen pochodzi z' lub coś równoważnego. Bez możliwości uzyskania deskryptora pliku, nie jestem pewien, czy mamy rozwiązanie. –

+1

'fmemopen' może być również zaimplementowane za pomocą' funopen' na BSD. Jedna realizacja jest dostępny na https://redmine.openinfosecfoundation.org/attachments/105/0001-fmemopen-wrapper-added-fix-compilation-problems-on-m.patch –

+0

'fork()' jest raczej ciężkie waga ten cel. Sugerowałbym zamiast tego użycie wątku. Byłoby jeszcze lepiej użyć 'select()' do multipleksowania pomiędzy odczytem i pisaniem z potoku, ale myślę, że to nie jest opcja tutaj. – Sven

2

Jasne, tylko open(argv[0], ...), skanowanie za pośrednictwem pliku dowiedzieć się, gdzie dane binarne zaczyna, lseek() tam i zrobione. Ten plik oczywiście nie będzie mieć długości twoich danych binarnych.

Powiązane problemy