我有一个使用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中重定向输出过程”。 –