c++: вывод подпроцесса в 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
мы все знаем, что операции ввода-вывода вычислительно медленные. Чтобы ускорить это, я хотел бы пропустить шаг записи в файл, а затем чтения из файла, и вместо этого перенаправить вывод этого подпроцесса непосредственно в stdin (или некоторые другие stream)
Как бы я это сделал? Как пропустить операцию ввода-вывода?
Примечание: многие программы выплевывают некоторые диагностические материалы в stdout во время их запуска и пишут чистую версию вывода в stdout (например: stdout: "step1...готово, Шаг 2...готово, Шаг 3..готово " - o file-out:" магическое число: 47.28"), поэтому игнорирование аргумента "- o " и доверие к тому, что вывод будет автоматически перенаправлен в stdout, не обязательно полезно...
спасибо всем продвижение.
3 ответов
используя 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;
}
Если вы случайно находитесь в windows:
следуйте за этим:http://support.microsoft.com/kb/190351
Он описывает это лучше, чем я когда-либо. Вы можете перенаправить все, везде.
лучше всего открыть команду оболочки с помощью popen()
. Это позволяет передать команду и получить обратно FILE*
указатель на выход. Смотри http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/FUNCTIONS/popen.html