0

0

C++怎么调用系统命令_C++system函数使用【执行】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-02-23 16:43:22

|

258人浏览过

|

来源于php中文网

原创

应避免在关键逻辑中使用system(),因其不安全、不可控、难调试:易卡住或返回-1,依赖shell导致跨平台行为不一致,无法获取真实退出码和标准输出,且存在命令注入风险;推荐linux/macos用fork()+exec()组合、windows用createprocess()替代。

c++怎么调用系统命令_c++system函数使用【执行】

别用 system() 做关键逻辑,它不安全、不可控、难调试。

为什么 system() 会卡住或返回 -1

常见现象是程序“假死”几秒后才继续,或者直接返回 -1 —— 这通常不是你命令写错了,而是 shell 启动失败或权限被拦截。Windows 下如果没设好环境变量(比如找不到 cmd.exe),Linux 下如果 /bin/sh 被删或 PATH 损坏,system() 就会直接失败。

  • system() 依赖系统默认 shell,不同平台行为不一致(Windows 用 cmd.exe,Linux/macOS 用 /bin/sh
  • 它会阻塞当前线程,且无法获取子进程的 stdout/stderr
  • 返回值只有成功/失败(0 或 -1),没法拿到真实 exit code(除非你自己解析 WEXITSTATUS,但 Windows 没这玩意)
  • 命令字符串会被 shell 解析,存在注入风险:std::string cmd = "rm -rf " + user_input; → 千万别这么干

替代方案:Linux/macOS 用 fork() + exec() 组合

想真正控制子进程、捕获输出、避免 shell 解析,就得绕过 system(),自己 fork+exec。这是 POSIX 标准做法,也是 system() 内部实际调用的底层逻辑。

  • fork() 创建子进程,再在子进程中调用 execvp()(推荐)或 execv(),传入程序路径和参数数组
  • 父进程用 waitpid() 等待并获取真实退出码,而不是只看 system() 的粗略返回值
  • 如果要读输出,得提前用 pipe() 创建管道,重定向子进程的 stdout,再 read() 读取
  • 注意:exec 系列函数不会返回,失败时需手动 exit(),否则子进程会继续跑父进程后续代码

Windows 下怎么安全执行命令

Windows 没有 fork(),但 CreateProcess() 是等价替代,而且更可控。它不经过 cmd 解析,默认也不启动新窗口(除非显式设 CREATE_NO_WINDOW)。

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

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

下载

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

  • CreateProcess() 替代 system(),传入完整路径(如 "C:\Windows\System32\ping.exe")比依赖 PATH 更可靠
  • 通过 STARTUPINFO 设置 hStdOutputhStdError 句柄,配合管道捕获输出
  • 别用 ShellExecute() 执行命令行工具——它专为打开文档/URL 设计,对 pingcurl 这类工具返回值不可靠,还可能弹窗
  • 注意宽字符:如果项目是 Unicode 编译模式,要用 CreateProcessW(),参数全为 wchar_t*

什么时候真能用 system()

仅限开发机上快速验证、脚本化构建步骤、或完全可信的静态命令(比如固定路径的清理脚本)。生产环境、用户输入参与拼接、需要错误分类处理的场景,一律避开。

  • 可以接受: system("mkdir build && cd build && cmake ..");(仅本地调试)
  • 不能接受:system(("grep " + keyword + " file.txt").c_str());(shell 注入)
  • 不能接受:system("python3 script.py > out.log");(重定向失效,log 文件为空,因为 shell 解析被绕过)
  • 跨平台项目尤其要警惕:同一行 system() 在 Windows 和 Linux 上可能一个成功一个报错,比如 system("sleep 1") 在 Windows 直接失败

真正麻烦的从来不是“怎么调起命令”,而是“命令挂了怎么知道”“输出在哪”“它到底有没有执行成功”。这些细节,system() 一概不管。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

830

2023.08.02

curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

452

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

182

2023.10.30

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

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

618

2023.08.03

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

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

217

2023.09.04

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

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

1558

2023.10.24

字符串介绍
字符串介绍

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

642

2023.11.24

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

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

1026

2024.03.22

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1127

2026.02.13

热门下载

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

精品课程

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

共94课时 | 10万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 19.1万人学习

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

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