1.简介
如果你在 C++ 项目里需要调用另一个程序——比如用 FFmpeg 转码视频、用 ImageMagick 处理图片,或者启动一个 Python 脚本——肯定经历过跨平台进程调用的痛苦。Windows 的 和 Unix 的 完全两套 API,还要处理管道、等待、错误码……光是让程序在不同系统上都能运行就得写一堆条件编译。
tiny-process-library 是一个单头文件的 C++ 跨平台进程管理库,统一了 Windows、Linux 和 macOS 上的外部进程调用 API。它支持同步和异步执行命令,可捕获子进程的 stdout/stderr 输出,并能设置工作目录及环境变量。使用时需注意不同系统的命令格式差异(如 cmd /c)、路径分隔符及编码问题。该库通过条件编译处理平台差异,适合需要启动和管理外部程序的 C++ 项目。

如果你在 C++ 项目里需要调用另一个程序——比如用 FFmpeg 转码视频、用 ImageMagick 处理图片,或者启动一个 Python 脚本——肯定经历过跨平台进程调用的痛苦。Windows 的 和 Unix 的 完全两套 API,还要处理管道、等待、错误码……光是让程序在不同系统上都能运行就得写一堆条件编译。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online
CreateProcessfork/exec这时候,tiny-process-library 就像给你配了个万能的'程序启动管家'。它是一个单头文件的 C++ 库,专门解决一件事:用统一的 API 在 Windows、Linux、macOS 上启动和管理外部进程,而且代码量极小,集成起来毫无负担。
它的特点有:
将源码中的 process.hpp、process.cpp(Windows 还需 process_win.cpp,Linux/macOS 需 process_unix.cpp)复制到你的项目目录,直接包含头文件即可使用。
git clone http://gitlab.com/eidheim/tiny-process-library
cd tiny-process-library
mkdir build
cd build
cmake ..
make ./examples
如果你的项目使用 CMake,可以通过 add_subdirectory 集成:
# 添加库目录
add_subdirectory(tiny-process-library)
# 链接库
target_link_libraries(你的项目名 tiny-process-library)
执行一个简单命令,等待执行完成并获取退出码:
#include "process.hpp"
#include <iostream>
int main() {
// 执行命令:Windows 用 "cmd /c echo hello",Linux/macOS 用 "echo hello"
#ifdef _WIN32
TinyProcessLib::Process process("cmd /c echo hello world", ".");
#else
TinyProcessLib::Process process("echo hello world", ".");
#endif
// 阻塞等待进程结束,获取退出码
int exit_code = process.get_exit_status();
std::cout << "进程退出码:" << exit_code << std::endl;
return 0;
}
Process 构造函数第一个参数是要执行的命令,第二个是工作目录(. 表示当前目录)get_exit_status() 是阻塞函数,会等待进程执行完成后返回退出码(0 表示成功)异步执行命令,实时捕获 stdout/stderr 输出,不阻塞主线程:
#include "process.hpp"
#include <iostream>
#include <string>
int main() {
// 存储输出的变量
std::string output, error;
#ifdef _WIN32
// Windows 执行 dir 命令
TinyProcessLib::Process process(
"cmd /c dir", ".",
[&output](const char* data, size_t size) { // stdout 回调
output.append(data, size);
},
[&error](const char* data, size_t size) { // stderr 回调
error.append(data, size);
}
);
#else
// Linux/macOS 执行 ls -l 命令
TinyProcessLib::Process process(
"ls -l", ".",
[&output](const char* data, size_t size) { // stdout 回调
output.append(data, size);
},
[&error](const char* data, size_t size) { // stderr 回调
error.append(data, size);
}
);
#endif
// 异步等待(非阻塞,也可以用 wait() 阻塞)
while (!process.try_get_exit_status()) {
// 主线程可以做其他事情
std::cout << "进程还在运行..." << std::endl;
// 休眠 500ms,避免循环过快
#ifdef _WIN32
Sleep(500);
#else
usleep(500000);
#endif
}
// 输出结果
std::cout << "=== 标准输出 ===" << std::endl;
std::cout << output << std::endl;
std::cout << "=== 错误输出 ===" << std::endl;
std::cout << error << std::endl;
return 0;
}
stdout 回调函数,子进程输出时会触发,参数是输出数据和长度stderr 回调函数,捕获错误输出try_get_exit_status() 是非阻塞检查进程是否结束,返回 true 表示进程已结束主动终止正在运行的子进程:
#include "process.hpp"
#include <iostream>
#include <chrono>
#include <thread>
int main() {
#ifdef _WIN32
TinyProcessLib::Process process("cmd /c ping -n 10 127.0.0.1", ".");
#else
TinyProcessLib::Process process("ping -c 10 127.0.0.1", ".");
#endif
// 运行 3 秒后终止进程
std::this_thread::sleep_for(std::chrono::seconds(3));
std::cout << "终止子进程..." << std::endl;
process.kill(); // 终止进程
// 等待进程完全退出
int exit_code = process.get_exit_status();
std::cout << "进程退出码:" << exit_code << std::endl;
return 0;
}
kill() 方法会强制终止子进程(Windows 下调用 TerminateProcess,Linux/macOS 下发送 SIGKILL)get_exit_status() 释放资源给子进程设置自定义环境变量:
#include "process.hpp"
#include <iostream>
#include <vector>
#include <string>
int main() {
// 构造环境变量列表(格式:KEY=VALUE)
std::vector<std::string> env = {"MY_VAR=hello_tiny_process", "PATH=/usr/bin"};
#ifdef _WIN32
TinyProcessLib::Process process(
"cmd /c echo %MY_VAR%", // Windows 读取环境变量
".",
[](const char* data, size_t size) {
std::cout << "输出:" << std::string(data, size) << std::endl;
},
nullptr,
env // 传入自定义环境变量
);
#else
TinyProcessLib::Process process(
"echo $MY_VAR", // Linux/macOS 读取环境变量
".",
[](const char* data, size_t size) {
std::cout << "输出:" << std::string(data, size) << std::endl;
},
nullptr,
env // 传入自定义环境变量
);
#endif
process.get_exit_status();
return 0;
}
cmd /c 命令(比如 cmd /c dir)ls -l)\,Linux/macOS 用 /,建议用 std::filesystem 处理路径ping.exe)cmd /c chcp 65001 && dir(65001 是 UTF-8 代码页)tiny-process-library 核心是 Process 类,支持同步 / 异步执行命令、捕获输出、终止进程,跨平台使用需注意命令格式差异。stdout/stderr,注意线程安全;同步执行用 get_exit_status() 阻塞等待。