Si j'ai un tampon qui contient les données d'un fichier, comment puis-je obtenir un descripteur de fichier? Ceci est une question dérivée de how to untar file in memoryComment obtenir le descripteur de fichier du tampon en mémoire?
Répondre
j'ai écrit un exemple simple comment faire FileDescriptor à une zone de mémoire:
#include <unistd.h>
#include <stdio.h>
#include <string.h>
char buff[]="qwer\nasdf\n";
int main(){
int p[2]; pipe(p);
if(!fork()){
for(int buffsize=strlen(buff), len=0; buffsize>len;)
len+=write(p[1], buff+len, buffsize-len);
return 0;
}
close(p[1]);
FILE *f = fdopen(p[0], "r");
char buff[100];
while(fgets(buff,100,f)){
printf("from child: '%s'\n", buff);
}
puts("");
}
Vous ne pouvez pas. Contrairement à C++, le modèle C d'E/S de fichier n'est pas ouvert à l'extension.
fmemopen peuvent retourner FILE * de tampon, mais fileno (fMemOuvre (...)) retour -1. J'ai une autre idée: créer du contenu de pipe et de buffer dans file_pipes [1] avec la fonction write(), et nous pouvons regarder le fichier file_pipes [0] comme le descripteur de ce buffer. Mais quand je pratique cela, la fonction write() vient de se bloquer. Le tampon noyau du tuyau n'est-il pas assez grand? Merci – solotim
C'est POSIX, IIRC. Pas C, c'est comme ça que vous avez tagué votre question. C'est à dire. ça ne marcherait pas sur Windows. – MSalters
- 1. Lecture des fichiers binaires, sans mise en mémoire tampon le fichier en mémoire en C++
- 2. fonction pour obtenir le descripteur de fichier terminal du processus en cours UNIX
- 3. Double mise en mémoire tampon dans BlackBerry?
- 4. Stop QNetworkRequest mise en mémoire tampon de la requête entière
- 5. GDI + Scrolling hors-écran en mémoire tampon
- 6. En c, comment bloquer un descripteur de fichier?
- 7. Obtenir le nom du fichier en PHP
- 8. Win32API - Comment obtenir le nom de fichier du processus à partir du handle de processus?
- 9. Envoi de la longueur du tampon et de la mémoire tampon sur la socket dans c
- 10. Obtenir le tampon de profondeur de QGLPixelBuffer
- 11. WaitForSingleObject sur un descripteur de fichier?
- 12. en passant le tampon char aux fonctions et en obtenant la taille du tampon
- 13. Simulation du descripteur de fichier dans l'espace utilisateur
- 14. Actionscript: bips NetStream après mise en mémoire tampon
- 15. Comment obtenir un flux FILE * à partir d'un descripteur de fichier?
- 16. Comment gérer les données de mise en mémoire tampon lues sur le réseau?
- 17. Comment puis-je obtenir le tampon de compilation en bas plutôt qu'à droite dans Emacs 23?
- 18. Flex VideoDisplay arrête la mise en mémoire tampon
- 19. Comment obtenir le nom de fichier d'une DLL?
- 20. Comment obtenir le chemin d'accès du fichier exécutable du service
- 21. Calculer le hachage sans avoir le tampon entier en mémoire à la fois
- 22. Déséquilibre du tampon de socket Linux
- 23. Comment obtenir un statut rapide à partir du tampon de compilation Emacs?
- 24. Taille de lecture du tampon de fichier optimale?
- 25. Yank nom de fichier/chemin du tampon courant dans Vim
- 26. Comment placer des balises EXIF dans un fichier JPG, avec le tampon jpeg brut en C++?
- 27. Obtenir une représentation en mémoire du rendu JPEG d'une image
- 28. Obtenir le chemin du fichier via javascript
- 29. Comment obtenir l'utilisation de la mémoire sous Windows en C++
- 30. obtenir le chemin du fichier txt
Nice. Comme amélioration modeste, vous pouvez utiliser ['fcntl (fd, F_SETPIPE_SZ, ...)'] (http://www.kernel.org/doc/man-pages/online/pages/man2/fcntl.2.html) pour augmenter la taille du tampon de conduite. Crédit à [msandiford] (http://stackoverflow.com/a/14129599/781723) pour cela. –
Sous Linux, ['vmsplice()'] (http://man7.org/linux/man-pages/man2/vmsplice.2.html) peut être utile: il évite d'avoir à utiliser une boucle for-write pour écrire des données à la pipe. –
C'est une solution assez géniale, mais si vous devez être capable de faire plus que lire depuis le fd (c'est-à-dire chercher), cela ne fonctionnera pas. Vous ne pouvez pas chercher sur un tuyau (du moins pas sur les plates-formes que j'utilise). –