C ++ - 使用system()进行Windows命令

时间:2013-08-05 17:55:55

标签: c++ windows windows-xp

我是C ++的新手,我read听到了using system calls is bad practice.那么如果你需要使用system()来运行像ipconfig或{netstat这样的Windows命令呢? {1}}。它仍然是邪恶的还是被认为是system()的可接受用途?我正在编写一个程序来收集有关系统的各种信息,我多次使用system()并将输出传输到文本文件中以供查看。

2 个答案:

答案 0 :(得分:5)

您进行的大多数调用都有可以直接使用的Windows API调用。理想情况下,您只需调用适当的Windows API调用,而不是启动进程,写入文件,然后解析文件。

话虽如此,在Windows上,CreateProcess将启动一个流程,为您提供比调用system更多的控制权。这包括使用STARTUPINFO为流程标准输出流提供您自己的HANDLE,这意味着您可以直接从流程中读取而无需写入文件。

答案 1 :(得分:1)

问题不在于使用system,而是在错误的频繁情况下滥用它。

  • 调用系统意味着调用命令解释器(CMD)为其提供要解析的字符串。如果该字符串是一个命令将被执行,如果它是一个程序将被调用,因为命令解释器的行为就是这样。

  • 调用CreateProcess意味着让内核启动将执行给定程序的进程。没有命令解释器调用。

现在要点是“命令解释器在执行中有作用,还是只是被动奴隶?

在第一种情况下(更罕见)system很可能是真正的方法。

在第二种情况下(更频繁),在两者之间放置一个命令解释器使得实际执行依赖于系统围绕它进行的最终调整(例如,启动批处理而不是命令)您可能不知道在用户的计算机上运行时这甚至可以转化为潜在的安全漏洞。)

系统的最常见用途是 - 经常看到的system("pause")在程序终止后保持控制台打开。它可以是一个快速而肮脏的解决方案,但这通常不是一种可行的方法,原因有两个:

  • 如果程序在另一个进程中执行,则没有人等待按键返回:只需在已打开的shell中启动该程序,shell将保持打开状态。

    < / LI>
  • 如果程序设计为交互式(因此有人提供输入),那么使用正常的i / o功能会更合适。