讲师中心 微信公众号
AI工具推荐 视频效率加速

c++怎么在程序中执行外部命令_c++系统调用与进程控制方法

大辰姑娘_7446

大辰姑娘_7446

发布时间:2025-11-09 14:15:02

|

540人浏览过

|

来源于php中文网

原创

答案:C++中执行外部命令需借助系统API或C库函数,常用方法包括std::system()、popen()/_popen()、fork()+exec()及CreateProcess()。std::system()最简单但安全性差;popen()可获取命令输出;fork()+exec()适用于类Unix系统并支持精细控制;Windows平台推荐使用CreateProcess()实现进程创建与管理。选择方法应根据跨平台需求、输出获取和控制精度决定,同时注意权限、路径和错误处理。

c++怎么在程序中执行外部命令_c++系统调用与进程控制方法

在C++中执行外部命令,本质是通过系统调用启动新进程来运行操作系统提供的命令或可执行文件。虽然C++标准库本身不直接提供进程控制功能,但我们可以借助操作系统的API(如POSIX或Windows API)或标准C库中的函数来实现。以下是几种常用方法。

使用 std::system() 函数

最简单的方式是使用 std::system(),它定义在 cstdlib 头文件中。该函数接受一个字符串参数,表示要执行的命令,并阻塞直到命令执行完毕。

示例:

#include <cstdlib>
int main() {
    std::system("ls -l"); // Linux/Unix
    // 或 std::system("dir"); // Windows
    return 0;
}

优点:跨平台写法简单。
缺点:无法获取输出结果,安全性较低(容易受到shell注入影响),且执行效率不高。

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

使用 popen() / _popen() 获取命令输出

如果需要读取外部命令的输出,可以使用 popen()(Linux/Unix)或 _popen()(Windows)。它返回一个文件流指针,可通过标准I/O函数读取命令输出。

示例(Linux):

#include <cstdio>
int main() {
    FILE* fp = popen("ls", "r");
    if (fp) {
        char buffer[128];
        while (fgets(buffer, sizeof(buffer), fp)) {
            printf("%s", buffer);
        }
        pclose(fp);
    }
    return 0;
}

Windows下将 popen 换成 _popen,pclose 换成 _pclose 即可。

windows-shell-syntax
windows-shell-syntax

在 Windows 上执行终端命令,或对比 Windows 与 Linux 的 Shell 语法时使用。建议先检测当前 Shell 是 PowerShell 还是 cmd.exe,再给出相应命令……

下载

使用 fork() + exec() 系列函数(仅限类Unix系统)

在Linux或macOS中,更底层的控制方式是结合 fork() 和 exec() 系列函数。这种方式能精确控制子进程的创建与执行。

步骤如下:

  • 调用 fork() 创建子进程
  • 在子进程中调用 execl()、execv() 等替换当前进程映像为新程序
  • 父进程可使用 wait() 等待子进程结束

示例:

#include <unistd.h>
#include <sys/wait.h>
#include <cstdio>
int main() {
    if (fork() == 0) {
        // 子进程
        execl("/bin/ls", "ls", "-l", nullptr);
        // 若exec成功,不会执行到这里
        return 1;
    } else {
        // 父进程
        wait(nullptr); // 等待子进程结束
    }
    return 0;
}

这种方法灵活,可用于重定向输入输出、设置环境变量等高级场景。

Windows平台使用 CreateProcess()

在Windows中,推荐使用 CreateProcess() API 来创建新进程执行外部程序。

示例:

#include <windows.h>
#include <cstdio>
int main() {
    STARTUPINFO si = {sizeof(si)};
    PROCESS_INFORMATION pi;

    if (CreateProcess(NULL, (LPSTR)"notepad.exe", NULL, NULL,
        FALSE, 0, NULL, NULL, &si, &pi)) {
        WaitForSingleObject(pi.hProcess, INFINITE); // 等待结束
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    }
    return 0;
}

注意:传入的命令行字符串必须是可修改的字符数组(非const)。

基本上就这些常见方式。选择哪种方法取决于你的需求:快速执行用 system(),获取输出用 popen(),精细控制则用 fork/exec 或 CreateProcess()。跨平台项目建议封装一层抽象接口以统一调用。不复杂但容易忽略权限、路径和错误处理问题。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1678

2024.03.01

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

354

2023.09.25

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

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

133

2025.08.27

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

748

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1009

2023.11.28

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2138

2023.09.20

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

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

1698

2023.08.03

剧云AI短剧创作教程合集
剧云AI短剧创作教程合集

本专题聚焦剧云AI短剧创作,讲解从短剧灵感、梗概、全局大纲到分集、分场和正文的完整流程及节奏设计方法。

0

2026.10.14

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn