2

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

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 捕获关闭并确保它以我希望它关闭的方式关闭。

4

1 回答 1

1

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

class PipeStream : public std::ofstream

并覆盖析构函数

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

以便 pclose(f) 在 fclose(f) 之前运行?

于 2014-01-22T07:42:48.983 回答