【问题标题】:Suppress system("ping") output in C++在 C++ 中抑制系统(“ping”)输出
【发布时间】:2011-05-03 00:05:48
【问题描述】:

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

我的问题是:我可以抑制 system("ping ") 的输出吗?我用 C++ 编写了我的代码,因为我最了解这种语言。当前代码打开运行系统命令的 ping.exe。如果我能阻止输出在它仍然 ping 时出现,那将是理想的。

我最终将把这个程序转入 Windows 服务,这就是为什么我想抑制命令行控制台窗口以及抑制 ping 输出的原因。谢谢。

【问题讨论】:

  • Win32 应用程序(使用 WinMain())不会阻止命令行出现吗?
  • 我不知道如何抑制输出,但 ping 是您通常避免使用 system() 的情况之一。
  • @muntoo:调用控制台程序意味着它需要一个控制台;控制台程序在 Windows 的 PE 格式中具有特殊标志,因此它们略有不同。
  • 我很想知道如何在不使用系统 ping 的情况下进行 ping,但我对编程还很陌生,所以我在网上发现的内容充其量是非常混乱的 :(

标签: c++ windows ping suppress


【解决方案1】:

尝试使用system("ping host > nul")nul 相当于 Windows 的 UNIX /dev/null)。

【讨论】:

  • 如果我能把你标记为答案就好了……但遗憾的是我没有问这个问题。
  • 不用冒号,“nul”就足够了。
  • @Samuel,@zvrba:我可以放置一个名为ping.exe 的恶意可执行文件,你的程序就会被搞砸。你几乎不应该使用system()cplusplus.com/forum/articles/11153 如果你正在创建一个 Windows 服务,那么情况至少是两倍。
  • @zvrba:即使他的可执行文件有只执行权限(即你不能破坏可执行文件),但如果程序的当前目录是每个人都有写权限的目录(这经常出现这种情况),那么您不需要受感染的系统即可将ping.exe 替换为恶意程序。
  • @zvrba:这是任何共享系统中的常见场景。如果您的任何低权限用户可以写入该目录,他们可以获得您的程序的权限;换句话说,如果您正在使用 system() 调用,那么您将把程序的权限泄露给系统上的每个人。除非您可以完全信任您的所有用户(在共享系统中永远不会,除非您有妄想症),否则您使用 system() 的程序存在安全隐患。
【解决方案2】:

一般来说,如果您要调用另一个程序但不希望它像 std::system 那样工作,您将需要一个特定于平台的函数,例如 UNIX 上的 fork()/exec() 或 @ 987654323@ 在 Windows 上。这些功能让您可以控制其他程序的运行方式,例如,它不显示输出或不创建控制台窗口等。

【讨论】:

    【解决方案3】:

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

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

    上述命令 ping IP 地址 100.100.100.100 并将输出定向到名为 response.dat 的文件。在 response.dat 中可以看到 ping 命令的响应。

    【讨论】:

    • 谢谢bjskishore,很高兴知道如果需要我可以将输出发送到文件。
    【解决方案4】:

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

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

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

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

    【讨论】:

    • 谢谢你的回答,我更喜欢隐藏控制台窗口,那太棒了。
    【解决方案5】:

    当您转到 Windows 并致电 CreateProcess() 时,请务必设置:

        lpStartupInfo->wShowWindow = SW_HIDE;
    

    这将确保隐藏由新进程创建的所有窗口。

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

    【讨论】:

    • lpStartupInfo在什么库下?
    • 嗨塞缪尔。 lpStartupInfo 是 CreateProcess() 函数的倒数第二个参数。有关详细信息,请参阅函数的文档(请参阅我原始帖子中的链接)。
    【解决方案6】:

    您也可以使用这种方式,这将在文件中返回输出,并且不会显示控制台窗口并冻结主应用程序,这非常有用。 首先,您需要包含 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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      相关资源
      最近更新 更多