С++: выход подпроцесса в stdin
Предположим, что я хочу вызвать подпроцесс из моей программы, и я хочу прочитать результат этого подпроцесса в моей программе.
Вот тривиальный способ сделать это:
//somefile.cpp
system("sub_process arg1 arg2 -o file.out");
//call the subprocess and have it write to file
FILE *f = std::fopen("file.out", "r");
//.... and so on
Мы все знаем, что операции ввода/вывода являются вычислительно медленными. Чтобы ускорить это, я хотел бы пропустить шаг write-to-file-then-read-from-file и вместо этого перенаправить вывод этого подпроцесса непосредственно в stdin (или некоторые другие поток)
Как мне это сделать? Как пропустить операцию ввода-вывода?
Примечание: многие программы выделяют некоторые диагностические материалы в stdout во время их запуска и записывают чистую версию вывода в stdout (ex: stdout: "step1... done, step2... done, step3..done" -o file-out: "Магическое число: 47.28" ), поэтому игнорирование аргумента "-o" и подтверждение того, что вывод будет автоматически перенаправлен на stdout, не обязательно полезно...
Спасибо всем заблаговременно.
Ответы
Ответ 1
Использование popen
пропускает файл и выдает вывод команды через буфер в памяти.
#include <iomanip>
#include <iostream>
using namespace std;
const int MAX_BUFFER = 255;
int main() {
string stdout;
char buffer[MAX_BUFFER];
FILE *stream = popen("command", "r");
while ( fgets(buffer, MAX_BUFFER, stream) != NULL )
stdout.append(buffer);
pclose(stream);
cout << endl << "output: " << endl << stdout << endl;
}
Ответ 2
Если вы оказались в окнах:
выполните следующие действия: http://support.microsoft.com/kb/190351
Он описывает это лучше, чем когда-либо. Вы можете перенаправить все, везде.
Ответ 3
Лучше всего открыть команду оболочки с помощью popen()
. Это позволяет вам передать команду и вернуть указатель FILE*
на вывод. См. http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/FUNCTIONS/popen.html