C++-使用system()for Windows命令
C++ - Using system() for Windows commands
我是C++的新手,我读过并听说过使用系统调用是不好的做法。那么,如果您需要使用system()来运行像ipconfig
或netstat
这样的Windows命令,该怎么办呢。它仍然是邪恶的还是被认为是对system()的一种可接受的使用?我正在编写一个程序来收集有关系统的各种信息,我多次使用system()并将输出通过管道传输到文本文件中以供审查。
您进行的大多数调用都有可以直接使用的Windows API调用。理想情况下,您只需调用适当的Windows API调用,而不是启动进程,写入文件,然后解析文件。
也就是说,在Windows上,CreateProcess
将启动一个进程,并为您提供比调用system
更多的控制。这包括使用STARTUPINFO
为流程标准输出流提供自己的HANDLE
,这意味着您可以直接从流程中读取,而无需写入文件。
问题不在于system
的使用,而是在错误频繁的情况下滥用它。
-
调用系统意味着调用命令解释器(CMD),给它一个字符串进行解析。如果该字符串是将执行的命令,如果是将调用的程序,因为命令解释器的行为是这样的。
-
调用
CreateProcess
意味着只让内核启动一个将执行给定程序的进程。没有命令解释器调用。
现在的问题变成了"命令解释器在执行中有作用吗?还是它只是一个被动的从属程序?
在第一种情况下(更罕见),system
最有可能是真正的方法。
在第二种情况下(更频繁),在两者之间放置一个命令解释器会使实际执行取决于系统在其周围进行的最终调整(例如,启动一个批处理而不是您的命令),当您在用户的机器上运行时,您可能不知道。这甚至可能导致潜在的安全漏洞。)
然而,系统最常见的用途是system("pause")
,它经常在程序终止后保持控制台打开。这可能是一个快速而肮脏的解决方案,但通常情况下不是这样,原因有两个:
-
如果一个程序在另一个进程中执行,就不会有人等待按键返回:只需在已经打开的shell中启动程序,shell就会保持打开状态。
-
如果一个程序被设计为交互式的(因此有人提供输入),那么使用正常的i/o功能将更合适。
- 在Linux for Windows上编译C++代码时出错
- 如何在 Linux for Windows 上通过 MinGW 构建静态 ICU 的 Boost
- 如何在 qt for windows 中使用 QAxObject 创建 docx 和 doc 文件?
- SFML 交叉编译 for Windows on Linux.
- 如何在"XAML for Windows Embedded (Compact 2013)"中切换图像
- Build Boost Regex for Windows VS2013
- 如何交叉编译一个在 Linux for Linux 和 Linux for Windows 中编译的程序?
- tesseract.lib (version 4 ) for windows 10 (x64)
- Git-Bash for Windows 'rm' 是如何工作的?
- 使用 Visual Studio 2013 编译 GDCM dlls 2.8.4 for Windows
- C++ on Jupyter Notebook for Windows
- OpenGL for Windows 7
- 在 Ubuntu for Windows 上构建 QT5 项目
- iostream GCC错误,转换为boost::filesystem::iostream for Windows
- SHOpenWithDialog analog for windows XP?
- GetConsoleScreenBufferInfoEx equivalent for windows XP?
- 尝试在 Visual Studio Express 2012 for Windows Desktop 中安装 SDL_t
- Boost Mutex implementation for Windows
- 在哪里下载 Visual C++ for Windows XP
- HwndHost for Windows Form - Win32 / WinForm Interoperability