C++中执行系统命令主要用system()和popen()。1. system()简单但只能获取退出状态,适用于无需输出的场景;2. popen()可读写命令数据流,适合需处理输出的情况,但需手动pclose()释放资源;两者均存在命令注入风险,需避免拼接不可信输入,并注意跨平台差异。

C++ 中执行系统命令主要有两种方式:使用 system() 函数和 popen() 函数。它们都能调用操作系统的 shell 来运行外部命令,但用途和行为有明显区别。下面从功能、用法、安全性等方面进行对比说明。
system() 函数:简单执行命令
system() 是最简单的执行系统命令的方式,定义在 头文件中。它直接调用系统的 shell(如 bash 或 cmd.exe)来运行指定的命令字符串。
基本语法:
int system(const char* command);
示例:
立即学习“C++免费学习笔记(深入)”;
#include#include int main() { int result = system("ls -l"); // Linux/macOS // int result = system("dir"); // Windows if (result == 0) { std::cout << "命令执行成功\n"; } else { std::cout << "命令执行失败\n"; } return 0; }
特点:
- 只能获取命令的退出状态,无法获取命令输出内容
- 阻塞执行,直到命令完成才返回
- 接口简单,适合只需“运行并忽略输出”的场景,如启动程序、删除文件等
- 存在安全风险,若命令字符串来自用户输入,可能引发命令注入
popen() 函数:执行命令并读取输出
popen() 提供了更强的功能,允许程序与命令的输入/输出流交互。它定义在 中,返回一个文件指针,可用于读写命令的数据流。
基本语法:
FILE* popen(const char* command, const char* mode); int pclose(FILE* stream);
mode 参数可为 "r"(读命令输出)或 "w"(向命令写入输入),常用的是 "r"。
示例:读取命令输出
#include#include #include int main() { FILE* fp = popen("ls -l", "r"); if (!fp) { std::cerr << "无法执行命令\n"; return -1; }
char buffer[1024]; while (fgets(buffer, sizeof(buffer), fp)) { std::cout << buffer; // 输出命令结果 } pclose(fp); return 0;}
特点:
- 可以捕获命令的标准输出(或输入),适合需要处理结果的场景
- 同样阻塞执行
- 比
system()更灵活,但也更复杂 - 需手动调用
pclose()释放资源 - 同样存在命令注入风险,需谨慎处理输入
主要区别总结
| 特性 | system() | popen() |
|---|---|---|
| 头文件 | ||
| 能否获取输出 | 不能 | 能 |
| 返回值 | 命令退出码 | 文件指针 |
| 资源管理 | 自动 | 需调用 pclose() |
| 适用场景 | 执行命令无需输出 | 需要读取或写入命令数据 |
使用建议
- 如果只是想运行一个命令并知道它是否成功,用
system()更简洁 - 如果需要获取命令的输出(比如执行 grep、ps、curl 等并分析结果),应使用
popen() - 避免拼接不可信的用户输入到命令字符串中,防止 shell 注入攻击
- 在跨平台项目中注意命令差异(如 ls vs dir)
- 考虑使用更安全的替代方案,如直接调用系统 API 或使用第三方库(如 boost::process)
基本上就这些。选择哪个函数取决于你是否需要与命令的输入输出交互。不复杂但容易忽略的是资源清理和安全性问题。










