2009-10-13 21 views

risposta

13

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

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

+0

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

+0

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

0

Non è possibile. A differenza del C++, il modello C di I/O di file non è aperto all'estensione.

+1

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

+0

Questo è POSIX, IIRC. Non C, che è il modo in cui hai taggato la tua domanda. Cioè non funzionerebbe su Windows. – MSalters

Problemi correlati