Кажется, у вас уже есть служба, работающая на порту 9999.
Вы можете перейти на вкладку «Монитор ресурсов» и сеть.
В разделе TCP-подключений проверьте столбец локального порта, чтобы проверить, какая служба уже использует этот порт.
Надеюсь, это поможет.
В реальных оболочках (значение, не морские оболочки - я имею в виду, не в Оболочке 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; вероятно, существует.
CRTs Microsoft и библиотека MSDN действительно включают системную функцию и функцию _popen.
Необходимо заполнить структуру 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 для наследования дескрипторов. Другие объяснили, как создать каналы, таким образом, я не повторю его здесь.