Se ho un buffer che contiene i dati di un file, come posso ottenere un descrittore di file da esso? Questa è una domanda derivata da how to untar file in memoryCome ottenere il descrittore di file del buffer in memoria?
risposta
Ho scritto un semplice esempio come fare filedescriptor ad un'area di memoria:
#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("");
}
Non è possibile. A differenza del C++, il modello C di I/O di file non è aperto all'estensione.
fmemopen possono tornare FILE * dal buffer, ma fileno (fmemopen (...)) return -1. Ho un'altra idea: creare pipe e caricare il contenuto del buffer in file_pipes [1] tramite la funzione write(), e possiamo guardare il file_pipes [0] come descrittore di file di quel buffer. Ma quando pratico questo, la funzione write() è appena bloccata. Il buffer del kernel della pipe non è abbastanza grande? Grazie – solotim
Questo è POSIX, IIRC. Non C, che è il modo in cui hai taggato la tua domanda. Cioè non funzionerebbe su Windows. – MSalters
- 1. Come ottenere il percorso del file utilizzando il descrittore di file su Android?
- 2. descrittore di socket vs descrittore di file
- 3. Come ottenere un puntatore FILE da un descrittore di file?
- 4. Come ottenere un flusso FILE * da un descrittore di file?
- 5. Come ottenere il descrittore di file in node.js se apri il file usando openSync
- 6. Scrive sul buffer di memoria invece del file con libjpeg?
- 7. Ottenere il descrittore di file assegnato più elevato
- 8. Dimensione del buffer ottimale per il file buffer?
- 9. come correggere Scapy "Attenzione l'API di pcapy non consente di ottenere il descrittore di file" capure "?
- 10. Come funzionano i limiti del descrittore di file linux?
- 11. Perdita del descrittore di file in nftw (FTW_CHDIR)?
- 12. Proprietà del buffer in Netty 4: Come viene gestito il ciclo di vita del buffer?
- 13. Descrittore di file duplicato con il proprio file offset
- 14. Come riaprire un descrittore di file chiuso
- 15. Come si assicura che la memoria del buffer sia allineata?
- 16. Come ottenere informazioni sul buffer/file corrente in emacs?
- 17. Bad descrittore di file in Ruby Demoni
- 18. Creazione di HBITMAP dal buffer di memoria
- 19. Come cambiare il sistema di codifica del buffer in Emacs?
- 20. Quante informazioni sono effettivamente memorizzate in un descrittore di file?
- 21. Ottenere la data/ora del pacchetto tramite la chiamata ioctl sul descrittore del file socket
- 22. Come posso ottenere un nome file da un descrittore di file all'interno di un modulo del kernel?
- 23. Descrittore file errato Golang
- 24. fopen crea un descrittore di file?
- 25. Come ottenere il nome del file di input in MRjob
- 26. python buffer di file come oggetto
- 27. Come ottenere il volume del file MP3?
- 28. Driver di dispositivo Linux, è possibile ottenere il numero minore utilizzando un descrittore di file?
- 29. Come ottenere l'output completo previsto quando la dimensione del buffer interno di dimensione expect_out (buffer) supera?
- 30. Come ottenere il percorso del file dall'URI?
Bello. Come modesto miglioramento, puoi usare ['fcntl (fd, F_SETPIPE_SZ, ...)'] (http://www.kernel.org/doc/man-pages/online/pages/man2/fcntl.2.html) per aumentare la dimensione del buffer del tubo. Credito a [msandiford] (http://stackoverflow.com/a/14129599/781723) per questo. –
Su Linux, ['vmsplice()'] (http://man7.org/linux/man-pages/man2/vmsplice.2.html) potrebbe essere utile: evita la necessità di un ciclo per scrivere dati alla pipa. –
Questa è una soluzione davvero fantastica, ma se devi essere in grado di fare di più che leggere dal file fd (cioè cercare), allora questo non funzionerà. Non puoi cercare su un tubo (almeno non sulle piattaforme che uso). –