我已经继承了我必须从我的代码中调用的这个函数。功能是 来自一个神秘的编程语言的古怪图书馆 - 所以我不能假设 几乎所有关于它的事情,除了它打印一些有用的事实 向stdout发送信息。
让我用
来模拟它的效果void black_box(int n)
{
for(int i=0; i<n; i++) std::cout << "x";
std::cout << "\n";
}
我想拦截并使用它输出的东西。为此,我重定向stdout
到一个临时文件,调用black_box
,然后恢复标准输出并阅读
来自临时文件的东西:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
int main(void){
int fd = open( "outbuff", O_RDWR | O_TRUNC | O_CREAT, 0600);
// Redirect stdout to fd
int tmp = dup(1);
dup2( fd, 1);
// Execute
black_box(100);
std::cout << std::flush;
// Restore old stdout
dup2(tmp, 1);
// Read output from the outbuff flie
struct stat st;
fstat(fd, &st);
std::string buf;
buf.resize(st.st_size);
lseek(fd, 0, SEEK_SET);
read(fd, &buf[0], st.st_size);
close(fd);
std::cout << "Captured: " << buf << "\n";
return 0;
}
这很有效。但是,为这样的任务在磁盘上创建文件并不是我的意思 引以为傲。我可以制作类似文件的东西,但是在内存中吗?
在建议管道之前,请考虑如果会发生什么
black_box
溢出其缓冲区。不,我需要它单线程 -
开始一个额外的过程/线程失败了我尝试的整个目的
实现。
答案 0 :(得分:1)
我想截取并使用它输出的内容。
[...]请考虑如果black_box溢出缓冲区会发生什么。
我看到两种选择。
如果您知道输出的最大尺寸,并且尺寸不是太大,请使用socketpair
代替pipe
。与管道不同,套接字允许更改出口/入口缓冲区的大小。
在/tmp
上使用临时文件。在正常情况下,它不会触摸磁盘(除非系统交换)。用于此目的的函数很少,例如mkstemp
(或tmpfile
)。