2009-10-13 57 views

回答

13

我寫了一個簡單的例子,如何使文件描述符到一個存儲區:

#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

不錯。作爲一個適度的增強,你可以使用['fcntl(fd,F_SETPIPE_SZ,...)'](http://www.kernel.org/doc/man-pages/online/pages/man2/fcntl.2.html )來增加管道緩衝區大小。感謝[msandiford](http://stackoverflow.com/a/14129599/781723)。 – 2015-06-19 00:41:26

+0

在Linux上,['vmsplice()'](http://man7.org/linux/man-pages/man2/vmsplice.2.html)可能是有用的:它避免了需要for循環來寫入數據到管道。 – 2015-06-19 00:59:28

+0

這是一個非常棒的解決方案,但如果您需要能夠從fd(即seek)讀取更多內容,那麼這將不起作用。你不能在管道上尋找(至少不是在我使用的平臺上)。 – 2016-06-09 19:37:04

0

你不能。與C++不同,文件I/O的C模型不可擴展。

+1

fmemopen可以從緩存返回FILE *,但的fileno(fmemopen(...))返回-1。我有另一個想法:通過write()函數創建管道和feed緩衝區內容到file_pipes [1],並且我們可以將file_pipes [0]視爲該緩衝區的文件描述符。但是當我練習這個時,write()函數就被阻塞了。管道的內核緩衝區不夠大?謝謝 – solotim 2009-10-13 08:12:32

+0

這是POSIX,IIRC。不是C,這是你如何標記你的問題。即它不適用於Windows。 – MSalters 2009-10-13 08:39:00

相關問題