【发布时间】:2014-02-12 02:44:34
【问题描述】:
所以...我开始另一个进程,它接受来自我的程序的一些输入(它也可以反过来)。类似的东西:
FILE *f(popen("sendmail", "w"));
现在,我可以将 f 放入 fstream 中,这样我就可以使用流(因为我的程序是 C++ 语言,这似乎是一个明智的做法。)
std::ofstream output(fileno(f));
...
output << "To: santa.claus@example.com" << std::endl;
...
到这里为止,我很好。现在是我完成向子进程发送数据的时候了。我想要的只是关闭管道。据我所知,我们应该使用 pclose() 因为该函数确保其他进程接收所有数据。换句话说,pclose() 函数知道如何干净利落地关闭管道。
不幸的是,由于我将 f 放在了 ofstream 中,我不能直接关闭它,可以吗?
pclose(f); // proper way to close a pipe
...
ofstream::~ofstream() { ... close(fd); ... } // not the right way to close a pipe
有没有办法从 ofstream 捕获关闭并确保它以我希望它关闭的方式关闭。
【问题讨论】:
-
我相信这可以在某种程度上帮助你:stackoverflow.com/a/1105009/2428958 另外,在这种情况下,你可能需要考虑派生 streambuf 并实现你自己的流类,而不是使用 std::ofstream - 因为你不能将自定义“关闭”附加到析构函数。
-
打开管道的代码应该关闭它。我建议将管道与析构函数关闭管道的类相关联。您不需要捕获关闭 - 您可以在对象被销毁时进行关闭。
-
@MateuszKołodziejski,这是完美的答案,您可以写一个实际的答案吗? (虽然链接并没有真正帮助,但从streambuf派生是我需要做的。)
标签: c++ pipe popen fclose pclose