Получать выходные данные другого процесса с использованием системной функции без использования файлов
Возможный дубликат:
Лучший способ захватить stdout из команды system(), чтобы он мог быть передан другой функции
У меня есть программа на C, в которой я вызываю системную функцию, для запуска другого исполняемого файла. Как получить вывод другой программы на консоли, а не в файл. Может ли что-то подобное сделать?
Да. Вы используете трубы. Каждый процесс имеет два стандартных потока: stdout и stderr. Это просто io потоки. Они могут отображаться в файлах или на консоли. Когда вы создаете новый процесс, вы устанавливаете новые каналы вывода процессов для перенаправления на дескрипторы файлов в процессе управления. Оттуда вы можете делать все, что захотите. Например, вы можете прочитать дочерние процессы и вывести их вывод в выходные каналы управления процессами.
В окнах вы делаете это так:
#define SHANDLE HANDLE
bool CmdShell::makePipe( SHANDLE& read, SHANDLE& write )
{
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof( SECURITY_ATTRIBUTES );
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = true;
SHANDLE writeTmp;
if ( !CreatePipe( &read, &writeTmp, &sa, 0 ))
{
assert(0);
return false;
}
if ( !DuplicateHandle( GetCurrentProcess(), writeTmp,
GetCurrentProcess(), &write, 0,
FALSE, DUPLICATE_SAME_ACCESS ))
{
assert(0);
return false;
}
CloseHandle( writeTmp );
return true;
}
В Linux вы делаете это так:
#define SHANDLE int
bool CmdShell::makePipe( SHANDLE& read, SHANDLE& write )
{
s32 pipeD[2];
if ( pipe( pipeD ))
{
assert(0);
return false;
}
read = pipeD[0];
write = pipeD[1];
return true;
}
Вопрос просто спросил: "Как мне получить выход другой программы на консоли..."
Простой ответ для другой программы для записи в стандартный вывод.
Ответы fancier необходимы для передачи вывода второй программы обратно в первую.
popen
запускает другую программу и дает вам интерфейс FILE * для вывода, поэтому вы можете читать его, как если бы вы читали файл, см. Как выполнить команду и получить вывод команды в C++ с помощью POSIX?