0

0

C++怎么调用系统命令 C++中system函数用法【总结】

穿越時空

穿越時空

发布时间:2026-03-06 11:36:01

|

349人浏览过

|

来源于php中文网

原创

system函数用于执行shell命令字符串,本质是fork+exec调用宿主shell;适合简单初始化任务,但无法捕获输出、细粒度控制进程或安全处理用户输入,易受命令注入和跨平台差异影响。

c++怎么调用系统命令 c++中system函数用法【总结】

system 函数能干啥,但别当万能胶

system 是 C 标准库函数,C++ 里也能用,本质是 fork + exec 调用 shell 执行命令字符串。它适合快速跑个简单命令,比如 system("mkdir -p build")system("cp file.txt /tmp/")。但它不返回命令输出,也不方便捕获错误码细节,更没法控制进程生命周期——你调了就等它结束,中间完全插不了手。

常见错误现象:system("ls | grep .cpp") 在某些嵌入式环境或禁用 shell 的系统上直接失败;system("python script.py > out.txt") 的重定向行为依赖宿主 shell,Windows 和 Linux 下的 cmd.exe/bin/sh 解析规则还不一样。

  • 只用于“执行完就完事”的场景,比如初始化目录、触发外部构建脚本
  • 别传用户输入拼接的字符串,否则是典型命令注入漏洞:system("echo " + user_input) 极其危险
  • Windows 下默认调用 cmd.exe,Linux/macOS 调用 /bin/sh,注意路径分隔符和通配符差异

怎么安全地传参给 system

不能拼字符串,得先转义或走间接路径。最稳妥的方式是把参数写进临时脚本再调用,尤其含空格、引号、$ 符号时。

例如想执行 ffmpeg -i "my video.mp4" -y out.mp4,直接拼:system("ffmpeg -i \"my video.mp4\" -y out.mp4") 看似可行,但遇到单引号、括号、$PATH 展开时极易崩。更可靠的做法:

立即学习C++免费学习笔记(深入)”;

  • std::filesystem::temp_directory_path() 创建临时 .sh 或 .bat 文件
  • 把完整命令写入该文件(确保路径用绝对路径,避免 cwd 影响)
  • 再调 system 执行这个脚本:system("/bin/sh /tmp/run_abc123.sh")

这样既规避了 shell 解析歧义,也便于调试——脚本内容可直接手动运行验证。

Shell脚本编写基础 中文WORD版
Shell脚本编写基础 中文WORD版

Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统

下载

替代方案:为什么 popen 更值得考虑

如果需要读取命令输出(比如 git rev-parse HEAD),popen 是比 system 更合适的选择。它返回 FILE*,能用 fgets 逐行读结果,还能通过 pclose 拿到退出状态。

注意点:

  • popen 只支持单向通信:"r" 可读输出,"w" 可写输入,不能同时读写
  • Windows 下 popen"w" 支持不稳定,建议优先用 "r"
  • 必须调 pclose,否则子进程变僵尸,且无法获取真实退出码
  • 示例:FILE* fp = popen("date +%s", "r"); char buf[64]; fgets(buf, sizeof(buf), fp); pclose(fp);

跨平台兼容性坑:system 返回值不是 exit code 全部

system 返回的是 POSIX waitpid 风格的状态码,不是命令本身的 exit(3)。得用 WEXITSTATUS 宏提取——直接拿返回值当错误码会误判。

比如 int ret = system("exit 3");,在 Linux 上 ret 通常是 768(即 3 ),不是 <code>3。Windows 下更混乱,可能直接返回 cmd 的错误级别。

  • 正确检查方式:if (WIFEXITED(ret)) { int code = WEXITSTATUS(ret); }
  • Windows 下没 WEXITSTATUS,得用 _CrtSetReportMode 或改用 CreateProcess + WaitForSingleObject
  • 若需精确控制超时、信号、环境变量,system 就不该出现在生产代码里

真正难的不是调用命令,而是预判 shell 行为、清理临时资源、处理编码和权限——这些往往比写几行 system 花的时间多十倍。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
fgets在c语言中的用法
fgets在c语言中的用法

本专题整合了c语言中fgets用法介绍,阅读专题下面的文章了解更多详细内容。

17

2025.08.27

fgets在c语言中的用法
fgets在c语言中的用法

本专题整合了c语言中fgets用法介绍,阅读专题下面的文章了解更多详细内容。

17

2025.08.27

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

718

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1561

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

648

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1168

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1142

2024.04.29

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

1

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.8万人学习

C 教程
C 教程

共75课时 | 5.2万人学习

C++教程
C++教程

共115课时 | 20.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号