c++正确关闭cout

标签 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 也是如此,但我认为处理方式是一样的。

最佳答案

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

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

您可能还想阅读:

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

关于c++正确关闭cout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16168391/

相关文章:

c++ - 我怎样才能最好地_选择_操作哪些内部参数?

c++ - Const 类成员复制构造函数

c++ - 类的构造函数与参数列表不匹配....但它确实......?

bash - 如何从 bash 脚本执行的 bash 脚本返回 PID

c++ - 将 std::cout 重定向到新创建的控制台

c++ - setsockopt 的错误 22 是什么?

linux - 在 Linux 中注册可由启动和停止命令控制的守护进程

java - 找不到可用的空闲守护进程

c++ - 为什么 char 0xA 在用控制台写入文件时会变成 0xD + 0xA 字符?

c++ - 如何在 C++ 中将字符串打印到控制台