【问题标题】:Redirecting std::cout when program is run as a service当程序作为服务运行时重定向 std::cout
【发布时间】:2012-11-15 09:07:39
【问题描述】:

我有一个使用 std::cout 打印到屏幕的 c++ 程序。

有时我需要将其作为服务运行。当 cout 作为 Windows 服务运行时,有什么办法可以看到它的输出?

将输出重定向到文件或某种调试程序是理想的。

显然我可以用写入文件的函数替换 cout,这可能就是我要做的,但我很想知道是否有其他解决方案。

【问题讨论】:

  • 在 Unix 系统上,您可以在启动进程时重定向标准输出,但我不熟悉 Windows 中的此类操作。可能,它应该存在。
  • 在我开始流程或管道之后重定向标准输出正是我想要的。
  • 尝试对 Windows 中的此类功能进行一些研究。应该有这样的东西。我会在谷歌上搜索“在 Windows 中重定向进程的输出”。
  • @KirilKirov:确实存在,SetStdHandle。在这种情况下,它并不完全是 _re_direction,因为服务最初没有标准 I/O 句柄。

标签: c++ windows cout


【解决方案1】:

基本上有无限的选择。最先想到的几个:

传递 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 的 1-liner,但我有一种毛骨悚然的感觉(this 似乎在 cmets 中强化了它)这是未定义的行为,因为 stdin 和 cout 可以不同步。

freopen("/path/to/file", "r", stdout);
//cout is now writing to path/to/file

日志库

我不知道有什么好的,但是您可以全力以赴并使用某种类型的日志记录库。 (还有 Windows 事件,但取决于您输出的内容,这可能没有意义。)

管道

我怀疑这对于 Windows 服务是否可行,但如果是,则始终存在经典重定向:

blah.exe > C:\path\file

【讨论】:

    【解决方案2】:

    简单的解决方案是SetStdHandle(STD_OUTPUT_HANDLE, your_new_handle)

    【讨论】:

      【解决方案3】:

      你可以这样做:

      class MyTerminal {
          std::stringstream terminalText;
      }
      
      class MyWindow {
      public:
           void OnUpdate();
      protected:
      CTextbox m_textbox;
      MyTerminal m_terminal;
      }
      
      void MyWindow::OnUpdate()
      {
          m_textBox.setText(m_terminal.terminalText.str());
          m_terminal.terminalText.str(std::string());
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-18
        • 1970-01-01
        • 2011-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多