做一个popen(),将FILE *指针放在fstream中,pclose()怎么样?

时间:2014-01-22 06:58:04

标签: c++ pipe popen fclose pclose

所以...我开始另一个接受我程序输入的进程(它也可以反过来)。类似的东西:

FILE *f(popen("sendmail", "w"));

现在,我可以将f放入fstream中,这样我就可以使用流(因为我的程序是在C ++中,这似乎是一件明智的事情。)

std::ofstream output(fileno(f));
...
output << "To: santa.claus@example.com" << std::endl;
...

到此为止,我很好。现在,我已经完成了向子进程发送数据的问题。我只想关闭管道。据我所知,我们应该使用pclose(),因为该函数确保其他进程接收所有数据。换句话说,pclose()函数知道如何干净地严重管道。

不幸的是,因为我把f放在一个流中,我不能只关闭它,可以吗?

pclose(f); // proper way to close a pipe
...
ofstream::~ofstream() { ... close(fd); ... } // not the right way to close a pipe

有没有办法捕捉来自ofstream的关闭并确保它以我希望它关闭的方式关闭。

1 个答案:

答案 0 :(得分:1)

我会从ofstream继承自定义类:

class PipeStream : public std::ofstream

并覆盖析构函数

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

这样pclose(f)在fclose(f)之前运行?