【问题标题】:c++ Closing cout properlyc ++正确关闭cout
【发布时间】:2013-04-23 11:37:58
【问题描述】:

我想编写一个充当远程外壳的守护程序。因此我必须关闭标准输入、标准输出和标准错误。

现在我想知道这是如何正确完成的。

std::streambuf * old = std::cout.rdbuf(mStdOut.rdbuf());
std::cout << "Bla" << std::endl;
std::string text = mStdOut.str();

这有效,流现在被重定向。但是“老”是什么意思?这不是旧缓冲区,应该删除吗?当我尝试删除它时,我得到一个空指针异常,即使指针本身不是 NULL。那么我怎样才能摆脱它,或者我可以简单地忽略它?如果忽略它,守护进程是否与终端正确解除关联?

stderr 和 stdin 也是如此,但我认为处理方式是相同的。

【问题讨论】:

    标签: c++ daemon cout


    【解决方案1】:

    您需要做的就是关闭实际的文件描述符。这当然是特定于平台的,但守护进程也是如此。因此,对于 POSIX 平台,您可以使用 POSIX API。重定向cout 后,您可以:

    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
    

    您可能还想阅读:

    http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html

    【讨论】:

      【解决方案2】:

      您应该在终止程序之前将原始缓冲区恢复到cout

      你不能删除它,因为你不知道它是否是动态分配的(或者其他代码是否会调用 delete,如果是的话)。

      【讨论】:

      • 虽然是真的,但这并不能回答这个问题。答案是不能通过cin/cout/cerr来完成,而是必须对底层的POSIX文件句柄完成。
      • 好的,所以问题中有两个部分。我回答了 C++ 和 cout 部分 - 不要删除流缓冲区。
      猜你喜欢
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 2015-10-20
      相关资源
      最近更新 更多