2009-10-05 49 views
1

我可以在c中創建一個匿名流嗎?我不想在文件系統上創建一個新文件,只需要一個函數可以寫入的數據流,而另一個函數可以從中讀取數據。不是C++,c。c中的匿名流

回答

6

也許您正在尋找管道。

將標準輸出轉發到管道。

然後另一個應用程序將從管道中讀取。

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 

#define RDR 0 
#define WTR 1 

char ** parseargs(char *string); 

int main(void){ 
    char mode = 'r'; 
    char prog[50] = "/bin/ps --version"; 
    char **argv; 
    int p[2]; 
    pid_t pid; 
    FILE *readpipe; 
    int pipein, pipeout; 
    char buf; 


    /* create the pipe */ 
    if(pipe(p) != 0){ 
     fprintf(stderr, "error: could not open pipe\n"); 
    } 

    pipein = p[RDR]; 
    pipeout = p[WTR]; 

    if((pid = fork()) == (pid_t) 0){ 



     close(pipein); 

     dup2(pipeout, 1); 
     close(pipeout); 


     if(execv(argv[0], argv) == -1){ 
     fprintf(stderr, "error: failed to execute %s\n", argv[0]); 
     } 
     _exit(1); 
    } 

    close(pipeout); 


    readpipe = fdopen(pipein, &mode); 

    while(!feof(readpipe)){ 
     if(1 == fread(&buf, sizeof(char), 1, readpipe)){ 
     fprintf(stdout, "%c", buf); 
     } 
    } 


    return 0; 
} 
0

哎呀,剛找到它......也許。 tmpfile()返回一個tmeporary文件*

這是正確的方法嗎?

+0

這仍然會創建一個文件... – 2009-10-05 14:13:10

1

是的,tmpfile()是一種方法。不過,由於安全考慮,我相信tmpfile()在這些日子裏是皺起了眉頭。

因此,您應該在Windows中使用mkstemp或在Windows中使用tmpfile_s而不是tmpfile()。

雖然這些仍然會在文件系統中創建文件。它們是暫時的,因爲當程序退出時它們「消失」。

另一種不創建物理文件的選項是mmap()。

0

如果你使用的是Unix(或者類似的操作系統),你可以閱讀Beej的Unix進程間通信指南(無論你的操作系統是什麼,它都是很好的閱讀)。
請在Beej's Guides查看。

在快速便知有沒有,我注意到一些事情你很可能有更多或更少的工作中使用(使用可選的創建文件/資源​​):

  • 管道
  • 的FIFO
  • 消息隊列
  • 共享內存段
  • 內存映射文件
  • Unix Sockets