我已经编写了一个简单的程序,可以ping三个站点,然后对它们是否可到达做出反应。在C++中抑制系统(“ping”)输出
我的问题是:我可以压制系统(“ping”)的输出吗?我已经用C++编写了我的代码,因为我知道语言是最好的。目前代码打开运行系统命令的ping.exe。如果我可以防止输出显示出来,而它仍然是理想的。
我最终会打开这个程序在一个Windows服务,这就是为什么我想要禁止命令行控制台窗口以及抑制ping输出。谢谢。
我已经编写了一个简单的程序,可以ping三个站点,然后对它们是否可到达做出反应。在C++中抑制系统(“ping”)输出
我的问题是:我可以压制系统(“ping”)的输出吗?我已经用C++编写了我的代码,因为我知道语言是最好的。目前代码打开运行系统命令的ping.exe。如果我可以防止输出显示出来,而它仍然是理想的。
我最终会打开这个程序在一个Windows服务,这就是为什么我想要禁止命令行控制台窗口以及抑制ping输出。谢谢。
您可以使用下面的系统命令来抑制ping命令的输出。
system("ping 100.100.100.100 > response.dat");
上述命令ping操作的IP地址100.100.100.100和输出定向到一个名为response.dat文件。在response.dat中你可以看到ping命令的响应。
谢谢bjskishore,很高兴知道我可以发送输出到文件,如果需要的话 – Samuel 2010-10-31 07:09:21
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成功)您必须等待命令完成。一旦完成后,您可以使用流程手柄来获取返回值,尽管我时间过于紧张,无法告诉您如何在此时执行此操作。
谢谢你的回答,我会更喜欢隐藏控制台窗口,那真是太棒了。 – Samuel 2010-10-31 07:08:15
一般来说,如果你要调用其他程序,但不希望它像std::system
行动,你会需要像在Windows平台的UNIX fork()
/exec()
或CreateProcess()
特定平台功能。这些功能让您控制如何在其他程序运行,例如,它没有显示输出和不创建一个控制台窗口等
当你在Windows和调用CreateProcess(),一定要设置:
lpStartupInfo->wShowWindow = SW_HIDE;
这将确保隐藏新进程创建的任何窗口。
使用DETACHED_PROCESS标志将阻止新进程继承应用程序的控制台,但这并不妨碍新进程创建新控制台。不知道ping会做什么,但最好通过使用SW_HIDE来消除所有疑问。
您也可以使用这种方式,这将返回文件中的输出,并且不会显示控制台窗口并冻结真正有用的主应用程序。首先你需要包含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");
Win32应用程序(使用WinMain())不会阻止命令行显示吗? – 2010-10-31 06:44:50
增加了'windows'标签。 – vitaut 2010-10-31 06:44:51
我不知道关于抑制输出,但ping是一般避免system()的情况之一。 – 2010-10-31 06:47:13