我有一個使用std :: cout打印到屏幕的C++程序。當程序作爲服務運行時重定向std :: cout
有時我需要將它作爲服務運行。當它作爲Windows服務運行時,有什麼方法可以看到cout輸出嗎?
重定向輸出到一個文件或某種調試程序將是理想的。
顯然,我可以用寫入文件的函數替換cout,這可能是我要做的,但我很想知道是否有其他解決方案。
我有一個使用std :: cout打印到屏幕的C++程序。當程序作爲服務運行時重定向std :: cout
有時我需要將它作爲服務運行。當它作爲Windows服務運行時,有什麼方法可以看到cout輸出嗎?
重定向輸出到一個文件或某種調試程序將是理想的。
顯然,我可以用寫入文件的函數替換cout,這可能是我要做的,但我很想知道是否有其他解決方案。
基本上有無限的選擇。最初的幾個浮現在腦海:
圍繞一個ostream參考通
你可以繞過一個std :: ostream的參考:
void someFunc(std::ostream& out) {
//someFunc doesn't need to know whether out is a file, cout, or whatever
out << "hello world" << std::endl;
}
更換cout
基礎緩衝區與文件
來自cplusplus.com的示例:
streambuf *psbuf, *backup;
ofstream filestr;
filestr.open ("test.txt");
backup = cout.rdbuf(); // back up cout's streambuf
psbuf = filestr.rdbuf(); // get file's streambuf
cout.rdbuf(psbuf); // assign streambuf to cout
cout << "This is written to the file";
這裏有一個帶有freopen的單引號,但是我有一種爬行的感覺(並且this似乎在註釋中重新強調它),它是未定義的行爲,因爲stdin和cout可以不同步。
freopen("/path/to/file", "r", stdout);
//cout is now writing to path/to/file
一個日誌庫
不是我頭頂的一個很好的肯定,但你可以去完全展開,使用某種類型的日誌庫。 (還有的Windows事件,雖然這取決於你輸出什麼,那可能沒有什麼意義。)
管道
我懷疑這是可能的Windows服務,但如果是,總是有經典重定向:
blah.exe > C:\path\file
簡單的解決方案是SetStdHandle(STD_OUTPUT_HANDLE, your_new_handle)
。
在Unix系統上,您可以在啓動進程時重定向標準輸出,但在Windows中我並不熟悉這樣的內容。可能它應該存在。 –
啓動過程或管道後重定向標準輸出正是我所需要的。 – Meir
嘗試在Windows中對此功能進行一些研究。應該有這樣的東西。我會谷歌的東西,如「在Windows中重定向輸出過程」。 –