内存文件,用于在函数调用

时间:2016-04-18 11:14:47

标签: unix stdout

我已经继承了我必须从我的代码中调用的这个函数。功能是 来自一个神秘的编程语言的古怪图书馆 - 所以我不能假设 几乎所有关于它的事情,除了它打印一些有用的事实 向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溢出其缓冲区。不,我需要它单线程 - 开始一个额外的过程/线程失败了我尝试的整个目的 实现。

1 个答案:

答案 0 :(得分:1)

  

我想截取并使用它输出的内容。

     

[...]请考虑如果black_box溢出缓冲区会发生什么。

我看到两种选择。

  1. 如果您知道输出的最大尺寸,并且尺寸不是太大,请使用socketpair代替pipe。与管道不同,套接字允许更改出口/入口缓冲区的大小。

  2. /tmp上使用临时文件。在正常情况下,它不会触摸磁盘(除非系统交换)。用于此目的的函数很少,例如mkstemp(或tmpfile)。