8

我是 C++ 新手,我已经阅读并听说使用系统调用是不好的做法。 那么,如果您需要使用 system() 来运行 Windows 命令,如ipconfigor netstat。它仍然是邪恶的还是被认为是 system() 的可接受使用?我正在编写一个程序来收集有关系统的各种信息,并且我多次使用 system() 并将输出通过管道传输到文本文件中以供查看。

4

2 回答 2

7

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

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

于 2013-08-05T18:00:38.140 回答
1

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

  • 调用系统意味着调用命令解释器(CMD)给它一个字符串来解析。如果该字符串是一个命令将被执行,如果它是一个程序将被调用,因为命令解释器的行为方式。

  • 调用CreateProcess意味着只是让内核引导一个将执行给定程序的进程。没有命令解释器调用。

现在重点变成了“命令解释器在你的执行中是否有作用,或者它只是一个被动的奴隶?

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

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

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

  • If a program is executed inside another process there can be no-one waiting to press a key to return: just launch the program in an already open shell, and the shell will remain open.

  • If a program is designed to be interactive (so there is a human providing input), then usign normal i/o functionality will be more appropriate.

于 2013-08-05T19:39:12.907 回答