c中的匿名流

时间:2009-10-05 14:04:59

标签: c stream

我可以在c中创建一个匿名流吗?我不想在文件系统上创建一个新文件,只有一个函数可以写入的流,而另一个函数可以从它传播。不是c ++,c。

4 个答案:

答案 0 :(得分:6)

也许你正在寻找烟斗。

将您的STDOUT转发到管道。

然后另一个应用程序将从管道读取。

#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;
}

答案 1 :(得分:1)

是的,tmpfile()是一种方法。但是,由于安全方面的考虑,我认为tmpfile()现在不赞成。

因此,您应该在POSIX中使用mkstemp或在Windows中使用tmpfile_s而不是tmpfile()。

但是,这些仍然会在文件系统中创建文件。他们是暂时的,因为他们在程序退出时“离开”。

另一个不创建物理文件的选项是mmap()。

答案 2 :(得分:0)

哎呀,刚刚发现它......也许吧。 tmpfile()返回临时FILE *

这是正确的方法吗?

答案 3 :(得分:0)

如果您使用的是Unix(或类似的操作系统),您需要阅读 Beej的Unix进程间通信指南(无论您的操作系统是什么,都可以很好地阅读。) 请查看Beej's Guides

快速浏览一下,我注意到你可能会使用或多或少的工作(以及可选的文件/资源​​创建):

  
      
  •   
  • 的FIFO
  •   
  • 消息队列
  •   
  • 共享内存段
  •   
  • 内存映射文件
  •   
  • Unix套接字
  •