2016-04-18 2 views
0

コードから呼び出す必要があるこの関数を継承しました。この関数は、秘密のプログラミング言語であるbizzareライブラリの です。したがって、 はほとんど役に立ちません。ただし、 の情報をstdoutに出力します。関数呼び出し時にstdoutを傍受するメモリ内ファイル

は私が、私はそれが出力のものを傍受して使用したい

void black_box(int n) 
{ 
    for(int i=0; i<n; i++) std::cout << "x"; 
    std::cout << "\n"; 
} 

とその効果をシミュレートしてみましょう。そのために私は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

出力するものを傍受して使用したいです。

[...] black_boxがバッファをオーバーフローさせた場合どうなるかを考えてください。

2つの選択肢があります。

  1. あなたは、出力の最大サイズを知っているし、サイズがあまりにも過大でない場合は、代わりにpipesocketpairを使用しています。パイプと異なり、ソケットは出入口バッファのサイズを変更することができます。

  2. /tmpの一時ファイルを使用してください。通常の場合、ディスクには触れません(システムがスワップしている場合を除く)。この目的のための機能はほとんどありません。たとえば、mkstemp(またはtmpfile)です。

関連する問題