我可以在c中创建一个匿名流吗?我不想在文件系统上创建一个新文件,只有一个函数可以写入的流,而另一个函数可以从它传播。不是c ++,c。
答案 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)
这是正确的方法吗?
答案 3 :(得分:0)
如果您使用的是Unix(或类似的操作系统),您需要阅读 Beej的Unix进程间通信指南(无论您的操作系统是什么,都可以很好地阅读。) 请查看Beej's Guides。
快速浏览一下,我注意到你可能会使用或多或少的工作(以及可选的文件/资源创建):
- 管
- 的FIFO
- 消息队列
- 共享内存段
- 内存映射文件
- Unix套接字