Итак … Я запускаю другой процесс, который принимает некоторые данные из моей программы (это может быть и наоборот). Что-то в этом роде:
FILE *f(popen("sendmail", "w"));
Теперь я могу поместить f в fstream, чтобы я мог просто использовать поток (поскольку моя программа на C ++, кажется, что это разумно).
std::ofstream output(fileno(f));
...
output << "To: [email protected]" << 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 и убедиться, что он закрывается так, как я хочу, чтобы он закрылся.
Я бы унаследовал пользовательский класс от ofstream:
class PipeStream : public std::ofstream
и перезаписать деструктор
PipeStream::~PipeStream { pclose(f) };
так что pclose (f) запускается до fclose (f)?
Других решений пока нет …