コードから呼び出す必要があるこの関数を継承しました。この関数は、秘密のプログラミング言語である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
がバッファをオーバーフローした場合にどうなるか考えてください。そして、いいえ、私はそれをシングルスレッドにする必要があります。 - 余分なプロセスを開始する/スレッドは、私が試していることを全目的に打ち破ります。