我已經繼承了我必須從我的代碼中調用的這個函數。該函數是一個神祕程序語言bizzare庫中的 - 所以我不能假設 幾乎與它有關的任何事情,除了它將一些有用的 信息打印到標準輸出。在函數調用中攔截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
溢出緩衝區會發生什麼情況。不,我需要它單線程 - 開始一個額外的過程/線程擊敗了我想要達到的全部目的ot我想要的 。