2010-05-12 15 views
6

Je souhaite pouvoir mapper la mémoire sur un descripteur de fichier afin de pouvoir utiliser certaines fonctions existantes nécessitant un descripteur de fichier. Voici ce essentiellement ce que je cherche:appel système pour mapper la mémoire à un descripteur de fichier (inverse 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 ... */ 

Quel système d'appel ou des appels, puis-je utiliser pour ce faire?

Répondre

3

Vous devriez jeter un œil à shm_open().

7

Certaines implémentations ont fmemopen(). (Alors bien sûr, vous devez appeler fileno()).

Si le vôtre ne le fait pas, vous pouvez le créer vous-même avec fork() et pipe().

+1

Il s'avère que 'fileno()' échoue à la fois sur Linux/FreeBSD (et je suppose que d'autres) lorsque le 'FILE *' vient de 'fmemopen' ou quelque chose d'équivalent. Sans moyen d'obtenir le descripteur de fichier, je ne suis pas sûr que nous ayons une solution. –

+1

'fmemopen' peut également être implémenté en utilisant' funopen' sur BSD. Une implémentation est disponible sur https://redmine.openinfosecfoundation.org/attachments/105/0001-fmemopen-wrapper-added-fix-compilation-problems-on-m.patch –

+0

'fork()' est assez lourd pour Cet objectif. Je suggère d'utiliser un fil à la place. Serait encore mieux d'utiliser 'select()' pour multiplexer entre la lecture et l'écriture depuis le tuyau, mais je suppose que ce n'est pas une option ici. – Sven

2

Bien sûr, juste open(argv[0], ...), parcourez le fichier pour trouver où vos données binaires commencent, lseek() là et fait. Ce fichier n'aura pas la longueur de vos données binaires bien sûr.