приложение запуска, получение stdout и stderr в C++

Кажется, у вас уже есть служба, работающая на порту 9999.

Вы можете перейти на вкладку «Монитор ресурсов» и сеть.
В разделе TCP-подключений проверьте столбец локального порта, чтобы проверить, какая служба уже использует этот порт.

Надеюсь, это поможет.

7
задан Jonathan Leffler 12 June 2009 в 22:38
поделиться

3 ответа

В реальных оболочках (значение, не морские оболочки - я имею в виду, не в Оболочке C или ее производных), затем:

program arg1 arg2 >/tmp/log.file 2>&1

Это запускает программу с данными аргументами и перенаправляет stdout к/tmp/log.file; нотация (иероглиф)'2>&1'в конце отправляет stderr (дескриптор файла 2) к тому же месту, что stdout (дескриптор файла 1) идет. Обратите внимание, что последовательность операций важна; если Вы инвертируете их, то стандартная погрешность пойдет туда, где стандартный вывод шел, и затем стандартный вывод (но не стандартная погрешность) будет перенаправлен в файл.

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

LOG=${TMPDIR:-/tmp}/log.$$.$(date +%Y%m%d-%H%M%S)
program arg1 arg2 >$LOG 2>&1

В C++ можно использовать system() функция (наследованный от C) для выполнения процессов. Если необходимо знать имя файла в (вероятной) программе C++, то генерируйте имя в программе (strftime() Ваш друг), и создайте командную строку с тем именем файла. (Строго, Вам также нужно getenv() получить $TMPDIR и функцию POSIX getpid() для получения идентификатора процесса, и затем можно моделировать сценарий оболочки с двумя строками (хотя используемый PID имел бы программу C++, не запущенную оболочку).

Вы могли вместо этого использовать POSIX popen() функция; необходимо было бы включать'2>&1'нотация в командной строке, которую Вы создаете для отправки стандартной погрешности команды к тому же месту как стандартный вывод, идет, но Вам не был бы нужен временный файл:

FILE *pp = popen("program arg1 arg2 2>&1", "r");

Можно затем прочитать поток файла. Я не уверен, существует ли очевидный способ для отображения потока файла C в C++ istream; вероятно, существует.

11
ответ дан 6 December 2019 в 14:11
поделиться

CRTs Microsoft и библиотека MSDN действительно включают системную функцию и функцию _popen.

0
ответ дан 6 December 2019 в 14:11
поделиться

Необходимо заполнить структуру STARTUP_INFO, которая имеет hStdInput, hStdOutput и hStdError. Не забудьте наследовать дескрипторы когда Вы CreateProcess.

/* Assume you open a file handle or pipe called myoutput */
STARTUP_INFO si_startinfo;
ZeroMemory(&si_startinfo, sizeof(STARTUP_INFO));
si_startinfo.cb = sizeof(STARTUP_INFO);
si_startinfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
si_startinfo.hStdOutput = myoutput;
si_startinfo.hStdError = myoutput;
si_startifno.dwFlags != STARTF_USEHANDLES;

PROCESS_INFORMATION pi_procinfo;
ZeroMemory(&pi_procinfo, sizeof(PROCESS_INFORMATION);

CreateProcess(NULL, cmdline, NULL, NULL, true, 0, NULL, pathname, &si_startinfo, &pi_procinfo);

Я не показал аспекты обработки ошибок, которые необходимо будет сделать. 5-й аргумент имеет значение true для наследования дескрипторов. Другие объяснили, как создать каналы, таким образом, я не повторю его здесь.

4
ответ дан 6 December 2019 в 14:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: