2009-10-13 5 views

Répondre

13

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

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

+0

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

+0

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

0

Vous ne pouvez pas. Contrairement à C++, le modèle C d'E/S de fichier n'est pas ouvert à l'extension.

+1

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

+0

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

Questions connexes