Подавить вывод системы ("ping") в C ++ - PullRequest
5 голосов
/ 31 октября 2010

Я написал простую программу, которая пингует три сайта и затем реагирует на то, доступны ли они или нет.

Мой вопрос: могу ли я подавить вывод системы ("ping")? Я написал свой код на C ++, так как знаю этот язык лучше всех. В настоящее время код открывает ping.exe с системной командой. Если я могу предотвратить вывод вывода, пока он все еще пингует, это было бы идеально.

Я в конечном итоге собираюсь превратить эту программу в службу Windows, поэтому я хотел бы отключить как окно консоли командной строки, так и подавить вывод ping. Спасибо.

Ответы [ 6 ]

17 голосов
/ 31 октября 2010

Попробуйте сделать system("ping host > nul") (nul - это эквивалент Windows * UNIX /dev/null).

6 голосов
/ 31 октября 2010

Как правило, если вы собираетесь вызывать другую программу, но не хотите, чтобы она действовала как std::system, вам понадобится функция для конкретной платформы, такая как fork() / exec() в UNIX или CreateProcess() в Windows. Эти функции дают вам контроль над тем, как работает другая программа, например, чтобы она не отображала вывод или не создавала консольное окно и т. Д.

3 голосов
/ 31 октября 2010

Вы можете использовать системную команду, как показано ниже, для подавления вывода команды ping.

system("ping 100.100.100.100 > response.dat");

Выше команды пингует IP-адрес 100.100.100.100 и направляет вывод в файл с именем response.dat.В response.dat вы можете увидеть ответ команды ping.

2 голосов
/ 13 марта 2012

Вы также можете использовать этот способ, он вернет вывод в файл и не отображает окна консоли и замораживает основное приложение, которое действительно полезно.Сначала вам нужно включить заголовок Windows с помощью;

#include <Windows.h>

, затем отправить команду ping и записать вывод в файл, подобный этому;

WinExec("ping google.com > file.dat", SW_HIDE); 

Это отправит команду pingна google.com и записывает вывод в файл 'file.dat' в каталоге текущей запущенной программы.Таким образом, вы можете изменить file.dat на любой файл или путь к файлу, который вы хотите, и, конечно, вы можете изменить команду ping.Символ> означает, что вывод команды необходимо записать в путь к файлу за ней.Если вы хотите показать окно консоли и заморозить приложение во время выполнения команды ping, вам нужно использовать следующую строку кода вместо кода WindExec ();

system("ping google.com > file.dat");
2 голосов
/ 31 октября 2010

Когда вы переходите в Windows и вызываете CreateProcess () , обязательно установите:

    lpStartupInfo->wShowWindow = SW_HIDE;

Это обеспечит скрытие всех окон, созданных новым процессом.

Использование флага DETACHED_PROCESS не позволит новому процессу наследовать консоль вашего приложения, но это не помешает новому процессу создать новую консоль. Не уверен, что пинг будет делать, но лучше удалить все сомнения, используя SW_HIDE.

2 голосов
/ 31 октября 2010

Do system ("ping site.com> nul 2> nul");и проверьте значение, которое возвращает оболочка.если эхо-запрос завершится успешно, оболочка вернет 0, иначе вернет 1. Я бы сказал более подробно, но Vis Studio переустанавливает себя.:)

Существует также способ скрыть окно консоли, используя Win API для выполнения команды, но ... я не помню подробностей.

Редактировать: Я все еще ждудля процесса установки MSVS, так что ... :) Используйте CreateProcess с флагом DETACHED_PROCESS для параметра dwCreationFlags, чтобы скрыть окно консоли.

После вызова процесса создания вам придется использовать WaitForSingleObject для процессадескриптор, чтобы дождаться завершения пинга.Последний параметр CreateProcess должен иметь указатель на информацию о процессе, содержащую дескриптор процесса.(Предполагая, что CreateProcess был успешным) Вам нужно дождаться завершения команды.Когда он будет завершен, вы можете использовать дескриптор процесса, чтобы получить возвращаемое значение, хотя я слишком потрудился, чтобы рассказать вам, как это сделать на данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...