【问题标题】:Do a popen(), put the FILE* pointer in an fstream, what about the pclose()?执行popen(),将FILE* 指针放入fstream,pclose() 呢?
【发布时间】: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


【解决方案1】:

我会从 ofstream 继承一个自定义类:

class PipeStream : public std::ofstream

并覆盖析构函数

PipeStream::~PipeStream { pclose(f) };

让 pclose(f) 在 fclose(f) 之前运行?

【讨论】:

  • 如果你想捕捉 close() 调用并且它不是虚拟的,那可能是个问题,对吧?由于 std::ofstream 是一个模板,我不能 100% 确定它是如何工作的,但我认为这与通常的类相同,因此仅使用 ofstream 的人可能会调用错误的 close() 函数...
猜你喜欢
  • 2012-05-26
  • 1970-01-01
  • 2010-11-16
  • 2011-10-25
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多