2010-05-12 13 views
6

Quiero poder asignar la memoria a un descriptor de archivo para que pueda usar algunas funciones existentes que necesitan un descriptor de archivo. Esto es esencialmente lo que estoy buscando:llamada del sistema para asignar la memoria a un descriptor de archivo (mmap inverso)?

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

¿Qué llamadas al sistema, o llamadas, puedo utilizar para lograr esto?

Respuesta

7

Algunas implementaciones tienen fmemopen(). (Entonces, por supuesto, debe llamar al fileno()).

Si la tuya no, puedes compilarla tú mismo con fork() y pipe().

+1

Resulta que 'fileno()' falla en Linux/FreeBSD (y presumo otros) cuando 'FILE *' viene de 'fmemopen' o algo equivalente. Sin una forma de obtener el descriptor de archivo, no estoy seguro de que tengamos una solución. –

+1

'fmemopen' también se puede implementar usando' funopen' en BSD. Una implementación está disponible en https://redmine.openinfosecfoundation.org/attachments/105/0001-fmemopen-wrapper-added-fix-compilation-problems-on-m.patch –

+0

'fork()' es bastante pesado para este propósito. Sugeriría usar un hilo en su lugar. Sería aún mejor usar 'select()' para multiplexar entre leer y escribir desde la tubería, pero supongo que no es una opción aquí. – Sven

2

Seguro, solo open(argv[0], ...), escanee el archivo para encontrar dónde comienzan sus datos binarios, lseek() allí y listo. Ese archivo no tendrá la longitud de tus datos binarios, por supuesto.

Cuestiones relacionadas