C++中执行外部命令主要用system()和exec系列函数:system()通过shell执行命令并返回程序,适合简单调用;exec函数族则替换当前进程映像,常与fork配合实现进程控制。

C++中执行外部命令主要通过system()和exec系列函数实现,两者用途不同:system用于调用系统shell执行命令并返回程序,而exec系列函数则用新程序替换当前进程,常用于进程替换场景。
使用system()执行外部命令
system()函数定义在cstdlib头文件中,适合简单地执行一条系统命令,比如运行可执行文件、调用脚本或执行shell指令。命令执行完毕后控制权会返回原程序。基本语法:
int system(const char* command);示例:
#include#include iostream>
int main() {
std::cout int result = system("ls -l"); // Linux/Unix
// int result = system("dir"); // Windows
if (result == 0) {
std::cout } else {
std::cout }
return 0;
}
注意:system()依赖系统shell,存在安全风险(如命令注入),不建议在高并发或安全性要求高的场景使用。
立即学习“C++免费学习笔记(深入)”;
使用exec系列函数替换当前进程
exec函数族定义在unistd.h(Unix/Linux)中,不会创建新进程,而是用新程序替换当前进程的映像。exec执行成功后,原程序代码不再运行;失败则返回-1。常见exec变体:
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统
- execl() — 参数列表形式
- execlp() — 按PATH查找程序
- execv() — 数组传参
- execvp() — 结合PATH查找 + 数组参数
execl示例:
#include#include
int main() {
std::cout execl("/bin/ls", "ls", "-l", nullptr);
std::cerr return 1;
}
execvp示例(更灵活):
char* args[] = {"ls", "-l", nullptr};execvp("ls", args);
重点:exec之后的代码只在执行失败时运行,成功则原进程被完全替换。
system与exec的选择建议
若只是临时调用一个命令并继续运行当前程序,用system()更方便。若在fork子进程后希望子进程运行另一个程序(如实现shell功能),应配合fork和exec使用。典型fork+exec模式:
#include#include
#include
int main() {
pid_t pid = fork();
if (pid == 0) {
// 子进程
execlp("ping", "ping", "-c", "4", "google.com", nullptr);
std::cerr } else if (pid > 0) {
// 父进程等待
wait(nullptr);
std::cout } else {
std::cerr }
return 0;
}
基本上就这些。system适合简单调用,exec用于进程替换,搭配fork可实现完整进程控制。








