2009-10-13 7 views

Respuesta

13

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(""); 
} 
+0

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. –

+0

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. –

+0

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). –

0

No se puede. A diferencia de C++, el modelo C de E/S de archivos no está abierto a la extensión.

+1

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

+0

Eso es POSIX, IIRC. No C, que es cómo etiquetó su pregunta. Es decir. no funcionaría en Windows. – MSalters

Cuestiones relacionadas