C++ 在C+中抑制系统(“ping”)输出+;

C++ 在C+中抑制系统(“ping”)输出+;,c++,windows,ping,suppress,C++,Windows,Ping,Suppress,我编写了一个简单的程序,ping三个站点,然后对它们是否可访问做出反应 我的问题是:我可以抑制系统(“ping”)的输出吗?我已经写了我的代码在C++中,因为我知道语言最好。当前代码打开运行系统命令的ping.exe。如果我能阻止输出在仍然ping时显示,那将是理想的 我最终将在windows服务中打开这个程序,这就是为什么我想同时抑制命令行控制台窗口和ping输出。谢谢。您可以使用如下系统命令来抑制ping命令的输出 system("ping 100.100.100.100 > resp

我编写了一个简单的程序,ping三个站点,然后对它们是否可访问做出反应

我的问题是:我可以抑制系统(“ping”)的输出吗?我已经写了我的代码在C++中,因为我知道语言最好。当前代码打开运行系统命令的ping.exe。如果我能阻止输出在仍然ping时显示,那将是理想的


我最终将在windows服务中打开这个程序,这就是为什么我想同时抑制命令行控制台窗口和ping输出。谢谢。

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

system("ping 100.100.100.100 > response.dat");
上面的命令ping IP地址100.100.100.100,并将输出定向到名为response.dat的文件。在response.dat中,您可以看到ping命令的响应。

尝试执行
系统(“ping主机>nul”)
nul
是windows中相当于UNIX的
/dev/null
)。

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

还有一种方法可以使用WinAPI隐藏控制台窗口来执行命令,但是。。。 我不记得细节了

编辑: 我还在等待MSV安装过程,所以…:) 将CreateProcess与dwCreationFlags参数的分离_进程标志一起使用,以隐藏控制台窗口


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

通常,如果您要调用另一个程序,但不希望它像
std::system
那样运行,则需要一个特定于平台的函数,如UNIX或Windows上的函数。这些函数使您可以控制其他程序的运行方式,例如,它不显示输出或不创建控制台窗口等。

当您转到Windows并调用时,请确保设置:

    lpStartupInfo->wShowWindow = SW_HIDE;
这将确保隐藏新进程创建的任何窗口


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

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

#include <Windows.h>
这将向google.com发送ping命令,并将输出写入当前运行程序目录中的文件“file.dat”。因此,您可以将file.dat更改为所需的任何文件或文件路径,当然也可以更改ping命令。>字符表示命令的输出需要写入其后面的文件路径。 如果要在运行ping命令时显示控制台窗口并冻结应用程序,则需要使用以下代码行而不是WindExec()代码


Win32应用程序(带有WinMain())是否会阻止命令行出现?我不知道如何抑制输出,但ping是通常避免system()的情况之一。@muntoo:调用控制台程序意味着它需要控制台;控制台程序在Windows的PE格式中有一个特殊的标志,因此它们略有不同。我很想知道如何在不使用系统ping的情况下ping,但我对编程相当陌生,因此我在网上发现的内容充其量也非常混乱:(如果我能把你标记为答案就好了……但遗憾的是我没有问这个问题。不需要冒号,“nul”就足够了。@Samuel,@zvrba:我可以放一个名为
ping.exe
的恶意可执行文件,你的程序就会出问题。你几乎不应该使用
system()
:如果您正在创建Windows服务,那么情况至少是原来的两倍。@zvrba:即使他的可执行文件具有仅执行权限(即,您不能破坏可执行文件),但如果程序的当前目录是每个人都有写访问权限的目录(通常情况下是这样的),则您不需要一个受损的系统来用恶意程序替换
ping.exe
。@zvrba:这在任何共享系统中都是常见的情况。如果您的任何低权限用户可以写入该目录,他们就可以获得您的程序权限;换句话说,如果您使用的是system()调用时,您正在将程序的权限泄露给系统中的每个人。除非您可以完全信任所有用户(在共享系统中永远不会这样,除非您是妄想),否则您的程序将使用system()是一个安全隐患。谢谢你的回答,我很想了解更多关于隐藏控制台窗口的信息,这将是非常棒的。谢谢你,bjskishore,如果需要的话,知道如何将输出发送到文件是非常好的。lpStartupInfo在哪个库下?嗨,Samuel。lpStartupInfo是CreateProcess()的倒数第二个参数函数。有关详细信息,请参阅函数的文档(请参阅我原始帖子中的链接)。
system("ping google.com > file.dat");