C++-使用system()for Windows命令

C++ - Using system() for Windows commands

本文关键字:for Windows 命令 使用 system C++-      更新时间:2023-10-16

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

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

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

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

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

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

现在的问题变成了"命令解释器在执行中有作用吗?还是它只是一个被动的从属程序?

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

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

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

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

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