我想编写一个充当远程 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/