2010-10-31 18 views
5

Ho scritto un programma semplice che esegue il ping di tre siti e quindi risponde alla loro disponibilità o meno.Sopprimere l'output del sistema ("ping") in C++

La mia domanda è: posso sopprimere l'output di sistema ("ping")? Ho scritto il mio codice in C++ perché so che la lingua è la migliore. Attualmente il codice apre ping.exe che esegue il comando di sistema. Se riesco a impedire che l'output venga visualizzato mentre fa ancora ping, sarebbe l'ideale.

Alla fine ho intenzione di trasformare questo programma in un servizio di Windows che è il motivo per cui vorrei sopprimere sia la finestra della console della riga di comando, nonché sopprimere l'uscita ping. Grazie.

+0

Non un'applicazione Win32 (con WinMain()) impedisce la visualizzazione della riga di comando? –

+0

Aggiunto il tag 'windows'. – vitaut

+1

Non so se sopprimere l'output, ma il ping è una di quelle situazioni in cui generalmente si evita system(). –

risposta

16

Provare a fare system("ping host > nul") (nul è equivalente a Windows di UNIX /dev/null).

+2

Se solo potessi segnare voi come una risposta ... ma purtroppo non ho chiesto la questione. –

+4

non c'è bisogno di due punti, "nul" è più che sufficiente. – avakar

+0

Grazie , questa risposta è molto succinta e fantastica – Samuel

3

È possibile utilizzare il comando di sistema come di seguito per sopprimere l'output del comando ping.

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

Sopra ping comando indirizzo IP 100.100.100.100 e dirige l'output in un file chiamato response.dat. In response.dat puoi vedere la risposta del comando ping.

+0

Grazie bjskishore, è molto bello sapere come mi può inviare l'output di file in caso di necessità. – Samuel

2

Do sistema ("ping site.com> nul 2> nul"); e controlla il valore restituito dalla shell. se il ping ha esito positivo, la shell restituirà 0, altrimenti restituirà 1. Sarebbe più dettagliato, ma Vis Studio si sta reinstallando. :)

C'è anche un modo per nascondere la finestra della console utilizzando l'API Win per eseguire il comando, ma ... Non ricordo i dettagli.

Edit: sto ancora aspettando la MSVS processo di installazione, quindi ... :) Utilizzare CreateProcess con la bandiera DETACHED_PROCESS per il parametro dwCreationFlags per nascondere la finestra della console.

Dopo aver chiamato il processo di creazione, è necessario utilizzare WaitForSingleObject sull'handle del processo per attendere il completamento del ping. L'ultimo parametro per CreateProcess dovrebbe avere un puntatore per elaborare le informazioni che contengono l'handle del processo. (Supponendo che CreateProcess abbia avuto successo) È necessario attendere il completamento del comando. Una volta completato, è possibile utilizzare l'handle di processo per ottenere il valore restituito, anche se sono troppo tempo per dirti come farlo a questo punto.

+0

Grazie per la tua risposta, mi piacerebbe di più di nascondere la finestra della console, sarebbe fantastico. – Samuel

6

In generale, se avete intenzione di chiamare un altro programma, ma non ne vogliono sapere di agire come std::system, si sta andando ad avere bisogno di una funzione specifica piattaforma come fork()/exec() su UNIX o CreateProcess() su Windows. Queste funzioni consentono di controllare come l'altro programma viene eseguito, per esempio, che non mostra l'uscita o meno di creare una finestra di console, ecc

2

Quando si arriva oltre a Windows e chiamare CreateProcess(), assicurarsi di impostare:

lpStartupInfo->wShowWindow = SW_HIDE; 

Ciò garantisce che tutte le finestre create dal nuovo processo siano nascoste.

L'utilizzo del flag DETACHED_PROCESS impedisce al nuovo processo di ereditare la console dell'applicazione, ma ciò non impedisce al nuovo processo di creare una nuova console. Non sei sicuro di cosa farebbe il ping, ma è meglio rimuovere tutti i dubbi usando SW_HIDE.

+0

Quale libreria è lpStartupInfo sotto? – Samuel

+0

Ciao Samuele.lpStartupInfo è il penultimo parametro della funzione CreateProcess(). Si prega di consultare la documentazione della funzione per i dettagli (vedere il link nel mio post originale). – CoreTech

2

Si potrebbe anche usare questo modo, questo restituirà l'output in un file e non si presenta una finestra di console e si blocca l'applicazione principale che è veramente utile. All'inizio è necessario includere l'intestazione di Windows usando;

#include <Windows.h> 

quindi inviare un comando ping e scrivere l'output in un file come questo;

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

Questo invierà un comando ping a google.com e scrive l'output al file 'file.dat' nella directory del programma in esecuzione corrente. In questo modo è possibile modificare file.dat in qualsiasi file o percorso file desiderato e, naturalmente, è possibile modificare il comando ping. Il carattere> indica che l'output del comando deve essere scritto nel percorso del file dietro di esso. Se si desidera visualizzare la finestra della console e congelare l'applicazione durante l'esecuzione del comando ping è necessario utilizzare la seguente riga di codice al posto del codice WindExec();

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