我编写了一个简单的程序,它 ping 三个站点,然后对它们是否可访问做出反应。
我的问题是:我可以抑制系统(“ping”)的输出吗?我用 C++ 编写了我的代码,因为我最了解这种语言。当前代码打开运行系统命令的 ping.exe。如果我可以阻止输出在它仍然 ping 时出现,那将是理想的。
我最终会在 Windows 服务中打开这个程序,这就是为什么我想抑制命令行控制台窗口以及抑制 ping 输出。谢谢。
尝试做system("ping host > nul")
(nul
Windows 相当于 UNIX /dev/null
)。
通常,如果您要调用另一个程序但不希望它std::system
像fork()
. 这些功能使您可以控制其他程序的运行方式,例如,它不显示输出或不创建控制台窗口等。exec()
CreateProcess()
您可以使用如下系统命令来抑制 ping 命令的输出。
system("ping 100.100.100.100 > response.dat");
上面的命令 ping IP 地址 100.100.100.100 并将输出定向到名为 response.dat 的文件。在 response.dat 中可以看到 ping 命令的响应。
当您转到 Windows 并调用CreateProcess()时,请务必设置:
lpStartupInfo->wShowWindow = SW_HIDE;
这将确保隐藏新进程创建的任何窗口。
使用 DETACHED_PROCESS 标志将阻止新进程继承应用程序的控制台,但这不会阻止新进程创建新控制台。不确定 ping 会做什么,但最好使用 SW_HIDE 消除所有疑问。
做系统(“ping site.com >nul 2>nul”);并检查 shell 返回的值。如果 ping 成功,shell 将返回 0,否则返回 1。我会更详细,但 Vis Studio 正在重新安装自身。:)
还有一种方法可以使用 Win API 来隐藏控制台窗口来执行命令,但是……我不记得细节了。
编辑:我仍在等待 MSVS 安装过程,所以... :) 使用带有 DETACHED_PROCESS 标志的 dwCreationFlags 参数的 CreateProcess 来隐藏控制台窗口。
调用创建进程后,您必须在进程句柄上使用 WaitForSingleObject 来等待 ping 完成。CreateProcess 的最后一个参数应该有一个指向包含进程句柄的进程信息的指针。(假设 CreateProcess 成功)您必须等待命令完成。完成后,您可以使用进程句柄来获取返回值,尽管我现在时间有限,无法告诉您如何执行此操作。
您也可以使用这种方式,这将在文件中返回输出并且不显示控制台窗口并冻结真正有用的主应用程序。首先,您需要使用包含 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");