2010-10-31 88 views
5

我已经编写了一个简单的程序,可以ping三个站点,然后对它们是否可到达做出反应。在C++中抑制系统(“ping”)输出

我的问题是:我可以压制系统(“ping”)的输出吗?我已经用C++编写了我的代码,因为我知道语言是最好的。目前代码打开运行系统命令的ping.exe。如果我可以防止输出显示出来,而它仍然是理想的。

我最终会打开这个程序在一个Windows服务,这就是为什么我想要禁止命令行控制台窗口以及抑制ping输出。谢谢。

+0

Win32应用程序(使用WinMain())不会阻止命令行显示吗? – 2010-10-31 06:44:50

+0

增加了'windows'标签。 – vitaut 2010-10-31 06:44:51

+1

我不知道关于抑制输出,但ping是一般避免system()的情况之一。 – 2010-10-31 06:47:13

回答

16

尝试做system("ping host > nul")nul是与UNIX /dev/null等效的Windows)。

+2

如果只有我可以将你标记为答案...但可惜我没有问这个问题 – 2010-10-31 06:57:43

+4

不需要冒号,“nul”就足够了 – avakar 2010-10-31 07:01:44

+0

谢谢,这个答案非常简洁并且很棒 – Samuel 2010-10-31 07:08:37

3

您可以使用下面的系统命令来抑制ping命令的输出。

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

上述命令ping操作的IP地址100.100.100.100和输出定向到一个名为response.dat文件。在response.dat中你可以看到ping命令的响应。

+0

谢谢bjskishore,很高兴知道我可以发送输出到文件,如果需要的话 – Samuel 2010-10-31 07:09:21

2

Do system(“ping site.com> nul 2> nul”);并检查shell返回的值。 如果ping成功,shell将返回0,否则返回1. 我会更详细一些,但Vis Studio正在重新安装自己。 :)

还有一种方法可以使用Win API来隐藏控制台窗口来执行命令,但是... 我不记得详细信息。

编辑: 我还在等待MSVS安装过程,所以...... :) 使用的CreateProcess与DETACHED_PROCESS标志的dwCreationFlags参数隐藏控制台窗口。

在调用create process之后,您必须在进程句柄上使用WaitForSingleObject才能完成ping。 CreateProcess的最后一个参数应该有一个指向包含进程句柄的进程信息的指针。 (假设CreateProcess成功)您必须等待命令完成。一旦完成后,您可以使用流程手柄来获取返回值,尽管我时间过于紧张,无法告诉您如何在此时执行此操作。

+0

谢谢你的回答,我会更喜欢隐藏控制台窗口,那真是太棒了。 – Samuel 2010-10-31 07:08:15

6

一般来说,如果你要调用其他程序,但不希望它像std::system行动,你会需要像在Windows平台的UNIX fork()/exec()CreateProcess()特定平台功能。这些功能让您控制如何在其他程序运行,例如,它没有显示输出和不创建一个控制台窗口等

2

当你在Windows和调用CreateProcess(),一定要设置:

lpStartupInfo->wShowWindow = SW_HIDE; 

这将确保隐藏新进程创建的任何窗口。

使用DETACHED_PROCESS标志将阻止新进程继承应用程序的控制台,但这并不妨碍新进程创建新控制台。不知道ping会做什么,但最好通过使用SW_HIDE来消除所有疑问。

+0

lpStartupInfo下的库是什么? – Samuel 2010-11-02 06:07:21

+0

嗨塞缪尔。lpStartupInfo是CreateProcess()函数的倒数第二个参数。有关详细信息,请参阅函数的文档(请参阅原始文章中的链接)。 – CoreTech 2010-11-04 12:07:40

2

您也可以使用这种方式,这将返回文件中的输出,并且不会显示控制台窗口并冻结真正有用的主应用程序。首先你需要包含Windows头文件;

#include <Windows.h> 

然后发送一个ping命令并将输出写入这样的文件;

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

这将向google.com发送一个ping命令,并将输出写入当前正在运行的程序的目录中的文件'file.dat'。因此,您可以将file.dat更改为您想要的任何文件或文件路径,当然您也可以更改ping命令。 >字符意味着命令的输出需要写在它后面的文件路径中。 如果您想在运行ping命令时显示控制台窗口并冻结应用程序,则需要使用以下代码行代替WindExec()代码;

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