2010-10-31 12 views
5

He escrito un programa simple que hace ping en tres sitios y luego reacciona si son alcanzables o no.Suprimir el sistema ("ping") de salida en C++

Mi pregunta es: ¿puedo suprimir la salida del sistema ("ping")? Escribí mi código en C++ porque conozco ese idioma de la mejor manera. Actualmente, el código abre el comando ping.exe que ejecuta el sistema. Si puedo evitar que aparezca la salida mientras suena, eso sería ideal.

Eventualmente voy a convertir este programa en un servicio de Windows por lo que me gustaría suprimir tanto la ventana de consola de la línea de comando como suprimir la salida de ping. Gracias.

+0

¿Una aplicación Win32 (con WinMain()) impide que la línea de comando aparezca? –

+0

Se agregó la etiqueta 'windows'. – vitaut

+1

No sé cómo suprimir la salida, pero hacer ping es una de esas situaciones en las que generalmente se evita el sistema(). –

Respuesta

16

Intenta hacer system("ping host > nul") (nul es el equivalente de Windows UNIX /dev/null).

+2

Si tan solo pudiera marcarlo como una respuesta ... pero lamentablemente no hice la pregunta. –

+4

No hay necesidad de los dos puntos, "nul" es suficiente. – avakar

+0

Gracias , esta respuesta es muy breve e impresionante. – Samuel

3

Puede usar el comando de sistema siguiente para suprimir la salida del comando ping.

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

Por encima de comando ping dirección IP 100.100.100.100 y dirige la salida a un archivo llamado response.dat. En response.dat puedes ver la respuesta del comando ping.

+0

Gracias bjskishore, es muy bueno saber cómo puede enviar la salida al archivo si es necesario. – Samuel

2

Do system ("ping site.com> nul 2> nul"); y verifica el valor que devuelve el shell. si el ping tiene éxito, el shell devolverá 0, de lo contrario devolverá 1. Sería más detallado, pero Vis Studio se está reinstalando. :)

También hay una manera de ocultar la ventana de la consola con la API de Windows para ejecutar el comando, pero ... No recuerdo los detalles.

Editar: Todavía estoy esperando el MSVS proceso de instalación, así que ... :) Uso CreateProcess con la bandera DETACHED_PROCESS para el parámetro dwCreationFlags para ocultar la ventana de la consola.

Después de llamar al proceso de creación, tendrá que usar WaitForSingleObject en el identificador del proceso para esperar a que finalice el ping. El último parámetro para CreateProcess debe tener un puntero para procesar la información que contiene el identificador del proceso. (Suponiendo que CreateProcess fue exitoso). Tiene que esperar que se complete el comando. Una vez que esté completo, puede usar el control del proceso para obtener el valor de retorno, aunque estoy demasiado tiempo capacitado para decirle cómo hacerlo en este momento.

+0

Gracias por su respuesta, me gustaría saber más sobre cómo ocultar la ventana de la consola, sería increíble. – Samuel

6

En general, si se va a llamar a otro programa, pero no quieren que ella actúe como std::system, vas a necesitar una función específica de la plataforma como fork()/exec() en UNIX o CreateProcess() en Windows. Estas funciones le permiten controlar cómo se ejecuta el otro programa, por ejemplo, que no muestra la salida o no crear una ventana de la consola, etc.

2

Al llegar a Windows y llamar CreateProcess(), asegúrese de ajustar:

lpStartupInfo->wShowWindow = SW_HIDE; 

Esto asegurará que las ventanas creadas por el nuevo proceso estén ocultas.

El uso del indicador DETACHED_PROCESS evitará que el nuevo proceso herede la consola de su aplicación, pero eso no impide que el nuevo proceso cree una nueva consola. No estoy seguro de qué haría ping, pero es mejor eliminar todas las dudas al usar SW_HIDE.

+0

¿En qué biblioteca se encuentra lpStartupInfo? – Samuel

+0

Hola Samuel.lpStartupInfo es el penúltimo parámetro de la función CreateProcess(). Consulte la documentación de la función para conocer los detalles (consulte el enlace en mi publicación original). – CoreTech

2

También podría usar de esta manera, esto devolverá la salida en un archivo y no aparecerá una ventana de consola y se congelará la aplicación principal que es realmente útil. Al principio necesita incluir el encabezado de Windows usando;

#include <Windows.h> 

luego envíe un comando ping y escriba el resultado en un archivo como este;

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

Esto enviará un comando ping a google.com y escribe el resultado en el archivo 'archivo.dat' en el directorio de su programa en ejecución actual. De modo que podría cambiar file.dat a cualquier archivo o ruta de archivo que desee y, por supuesto, podría cambiar el comando ping. El carácter> significa que la salida del comando debe escribirse en la ruta del archivo detrás de él. Si desea mostrar la ventana de la consola y congelar la aplicación mientras ejecuta el comando ping, debe usar la siguiente línea de código en lugar del código WindExec();

system("ping google.com > file.dat"); 
Cuestiones relacionadas