Si tengo un búfer que contiene los datos de un archivo, ¿cómo puedo obtener un descriptor de archivo de él? Esta es una pregunta derivada de how to untar file in memory¿Cómo obtener el descriptor de archivo del búfer en la memoria?
Respuesta
me escribió un ejemplo sencillo de cómo hacer un descriptor de archivo a un área de 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("");
}
No se puede. A diferencia de C++, el modelo C de E/S de archivos no está abierto a la extensión.
fmemopen pueden volver FILE * de memoria intermedia, pero fileno (fmemopen (...)) devuelven -1. Tengo otra idea: crear contenido de buffer de canalización y alimentación a file_pipes [1] mediante la función write(), y podemos mirar file_pipes [0] como el descriptor de archivo de ese buffer. Pero cuando practico esto, la función write() acaba de bloquearse. ¿El buffer del kernel de la tubería no es lo suficientemente grande? Gracias – solotim
Eso es POSIX, IIRC. No C, que es cómo etiquetó su pregunta. Es decir. no funcionaría en Windows. – MSalters
- 1. python cerrar el descriptor del archivo pregunta
- 2. C: leer el archivo binario en la memoria, alterar el búfer, escribir el búfer en el archivo
- 3. descriptor de socket vs descriptor de archivo
- 4. ¿Cómo obtener un puntero ARCHIVO desde un descriptor de archivo?
- 5. ¿Cómo escribir en un búfer de memoria con un ARCHIVO *?
- 6. ¿Cómo obtener información sobre el búfer/archivo actual en emacs?
- 7. ¿Cómo obtener una secuencia FILE * desde un descriptor de archivo?
- 8. CreateProcess desde el búfer de memoria
- 9. llamada del sistema para asignar la memoria a un descriptor de archivo (mmap inverso)?
- 10. ¿Cómo obtener el tamaño de la memoria del sistema disponible?
- 11. Obtener el nombre del archivo de búfer sin extensión en .emacs
- 12. C# obtener el tamaño de la memoria caché del archivo del sistema
- 13. emacs lisp, ¿cómo obtener el modo principal de búfer?
- 14. Escribir en el búfer de memoria en lugar de archivo con libjpeg?
- 15. ¿ftell en un descriptor de archivo?
- 16. En R, ¿cómo trazar en un búfer de memoria en lugar de un archivo?
- 17. Cómo obtener el estado del archivo de carga en Flask
- 18. ¿Cómo obtener la dirección de memoria del montón de Java?
- 19. ¿Cómo leer usando "leer" del descriptor de archivo 3 en el script bash?
- 20. ¿Cómo obtener el contenido del búfer actual en el modo de comando vim?
- 21. ¿Está ejecutando paquetes SSIS en asignaciones de memoria separadas o aumentando el tamaño predeterminado del búfer?
- 22. Malo descriptor de archivo en Ruby Demonios
- 23. ¿Fopen crea un descriptor de archivo?
- 24. Enviar archivo escribe en el búfer en memoria (fopen algo, pero escribir para amortiguar, no disco)
- 25. ¿Cómo ejecutar un programa desde el descriptor de archivo?
- 26. ¿Por qué declarar una clase de descriptor en la función __init__ rompe la funcionalidad del descriptor?
- 27. ¿Cómo obtener el nombre del archivo de la intención?
- 28. extraer el archivo HANDLE del descriptor de archivo de Windows o de FILE *
- 29. Obtener el tamaño de la memoria del sistema operativo Java
- 30. ¿La escritura de archivo C++ de corriente utiliza un búfer?
Agradable. Como una mejora modesta, puede usar ['fcntl (fd, F_SETPIPE_SZ, ...)'] (http://www.kernel.org/doc/man-pages/online/pages/man2/fcntl.2.html) para aumentar el tamaño del búfer de tubería. Gracias a [msandiford] (http://stackoverflow.com/a/14129599/781723) por esto. –
En Linux, ['vmsplice()'] (http://man7.org/linux/man-pages/man2/vmsplice.2.html) puede ser útil: evita la necesidad de un for-loop para escribir datos a la tubería. –
Esta es una solución bastante impresionante, pero si necesita poder hacer algo más que leer desde el archivo fd (es decir, buscar), entonces esto no funcionará. No puedes buscar en una tubería (al menos no en las plataformas que uso). –