Сделайте popen(), поместите указатель FILE* в поток, как насчет 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 в ofstream, я не могу просто закрыть его, не так ли?
pclose(f); // proper way to close a pipe
...
ofstream::~ofstream() { ... close(fd); ... } // not the right way to close a pipe
Есть ли способ захватить закрытие из ofstream и убедиться, что он закрывается так, как я хочу, чтобы он закрылся.
1 ответ
Я бы унаследовал пользовательский класс от ofstream:
class PipeStream : public std::ofstream
и перезаписать деструктор
PipeStream::~PipeStream { pclose(f) };
так что pclose(f) запускается до fclose(f)?