2

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

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

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

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

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

4

2 回答 2

4

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

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

您可能还想阅读:

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

于 2013-04-23T11:55:53.257 回答
3

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

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

于 2013-04-23T11:46:36.540 回答