Сделайте popen (), поместите указатель FILE * в поток, как насчет pclose ()?

Итак … Я запускаю другой процесс, который принимает некоторые данные из моей программы (это может быть и наоборот). Что-то в этом роде:

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 и убедиться, что он закрывается так, как я хочу, чтобы он закрылся.

2

Решение

Я бы унаследовал пользовательский класс от ofstream:

class PipeStream : public std::ofstream

и перезаписать деструктор

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

так что pclose (f) запускается до fclose (f)?

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]