2016-04-18 23 views
0

我已經繼承了我必須從我的代碼中調用的這個函數。該函數是一個神祕程序語言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我想要的 。

回答

1

我想攔截並使用它輸出的東西。

請考慮如果black_box溢出其緩衝區會發生什麼情況。

我看到兩種選擇。

  1. 如果知道輸出的最大尺寸和大小不是太過分了,用socketpair代替pipe。與管道不同,套接字允許改變出口/入口緩衝區的大小。

  2. /tmp上使用臨時文件。在正常情況下,它不會觸摸磁盤(除非系統正在交換)。功能很少,例如mkstemp(或tmpfile)。