c ++正确关闭cout

时间:2013-04-23 11:37:58

标签: c++ daemon cout

我想编写一个充当远程shell的守护进程。因此,我必须关闭stdin,stdout和stderr。

现在我想知道这是如何做得好的。

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

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

stderr和stdin也一样,但我认为治疗方法是一样的。

2 个答案:

答案 0 :(得分:4)

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

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

您可能还想阅读:

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

答案 1 :(得分:3)

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

您无法删除它,因为您不知道它是否是动态分配的(或者如果某些其他代码会调用delete,则会删除它。)

相关问题