我想编写一个充当远程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也一样,但我认为治疗方法是一样的。
答案 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,则会删除它。)