使用 system()
函数(最简方法)
system()
是标准库函数,直接执行字符串形式的DOS命令,适用于简单操作。
步骤:
- 包含头文件
<stdlib.h>
- 直接传入命令字符串
int main() { // 示例:创建目录并列出文件 system("mkdir my_folder"); // 创建文件夹 system("dir /B > file_list.txt"); // 列出文件并保存 return 0; }
特点:
- ✅ 优点:简单易用,跨平台(Windows/Linux需调整命令)。
- ❌ 缺点:无法直接获取命令输出;阻塞当前进程直到命令完成。
使用 _popen()
函数(读取命令输出)
Windows特有的 _popen()
可执行命令并捕获输出,适合需要处理结果的场景。
步骤:
-
包含头文件
<stdio.h>
和<stdlib.h>
-
使用管道读取命令返回的数据
#include <stdio.h> int main() { FILE *pipe; char buffer[128]; // 执行dir命令并读取结果 pipe = _popen("dir /B", "r"); // "r"表示读取命令输出 if (pipe == NULL) { perror("_popen failed"); return 1; } // 逐行读取输出 while (fgets(buffer, sizeof(buffer), pipe) != NULL) { printf("File: %s", buffer); // 打印文件名 } _pclose(pipe); // 关闭管道 return 0; }
特点:
- ✅ 优点:可实时获取命令输出。
- ❌ 缺点:仅适用于Windows;需手动管理管道资源。
使用Windows API(高级控制)
通过 CreateProcess()
等API实现精细控制(如异步执行、隐藏窗口)。
示例(精简版):
#include <windows.h> int main() { STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi; // 执行"echo Hello, DOS!"命令 CreateProcess( NULL, "cmd.exe /C echo Hello, DOS!", // /C表示执行后关闭 NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); // 等待命令完成 WaitForSingleObject(pi.hProcess, INFINITE); // 释放资源 CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return 0; }
适用场景:
- 需要隐藏控制台窗口(设置
STARTF_USESHOWWINDOW
)。 - 异步执行或监控进程状态。
关键安全建议
- 命令注入防护
错误做法:直接拼接用户输入char user_input[100]; scanf("%s", user_input); system(user_input); // 危险!用户可输入"del *.*"等恶意命令
正确做法:校验输入内容,或使用API参数化调用。
- 路径处理
避免使用相对路径,优先转换为绝对路径(如GetFullPathName()
)。 - 权限控制
敏感操作(如删除文件)需确认用户权限。
方法对比
方法 | 适用场景 | 输出捕获 | 复杂度 |
---|---|---|---|
system() |
快速执行简单命令 | 低 | |
_popen() |
需读取输出(Windows专属) | 中 | |
Windows API | 精细控制进程 | 高 |
- 日常任务推荐
system()
,简单高效。 - 需处理输出时用
_popen()
。 - 开发大型应用或需隐藏窗口时选择Windows API。
始终牢记: 对外部输入严格过滤,避免执行未经验证的命令。
引用说明:本文代码示例参考微软官方文档《CRT函数库》和《Windows API指南》,安全建议基于OWASP命令注入防护标准,实践前请确保开发环境为Windows并配置C编译器(如MSVC/MinGW)。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/5272.html