Получать выходные данные другого процесса с использованием системной функции без использования файлов

44
3

Возможный дубликат:
Лучший способ захватить stdout из команды system(), чтобы он мог быть передан другой функции

У меня есть программа на C, в которой я вызываю системную функцию, для запуска другого исполняемого файла. Как получить вывод другой программы на консоли, а не в файл. Может ли что-то подобное сделать?

спросил(а) 2012-07-09T17:16:00+04:00 7 лет, 5 месяцев назад
3
Решение
45

Да. Вы используете трубы. Каждый процесс имеет два стандартных потока: 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;
}

ответил(а) 2012-07-09T17:27:00+04:00 7 лет, 5 месяцев назад
Еще 2 ответа
32

Вопрос просто спросил: "Как мне получить выход другой программы на консоли..."

Простой ответ для другой программы для записи в стандартный вывод.


Ответы fancier необходимы для передачи вывода второй программы обратно в первую.

ответил(а) 2012-07-09T17:36:00+04:00 7 лет, 5 месяцев назад
34

popen запускает другую программу и дает вам интерфейс FILE * для вывода, поэтому вы можете читать его, как если бы вы читали файл, см. Как выполнить команду и получить вывод команды в C++ с помощью POSIX?

ответил(а) 2012-07-09T17:23:00+04:00 7 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема