发布于2026-07-13 阅读(0)
扫一扫,手机访问
在Linux系统里用C++管理进程,其实是个挺经典的课题。很多刚接触的同学会觉得又是进程又是信号又是IPC,有点乱。但说穿了,Linux提供的那套进程管理机制,核心就那么几个套路——创建、执行、通信、同步、控制。把这些理清了,写出来的代码才能既稳又活。

先聊聊最基础的两把刀:fork() 和 exec() 系列函数。fork() 就像复印机,把当前进程复制一份,得到父子两个几乎一模一样的进程。而 exec() 系列(比如 execl()、execv())则是“换壳”——在当前进程的肚子里加载一个全新的程序,旧壳子直接扔掉。组合起来用,就能实现真正的进程启动:先 fork() 出一个子进程,然后在子进程里调用 exec() 跑新程序。
#include
#include
pid_t pid = fork();
if (pid == -1) {
// 错误处理
} else if (pid == 0) {
// 子进程
execl("/path/to/program", "program", (char *)NULL);
// 如果exec失败,子进程将继续执行下面的代码
} else {
// 父进程
// 可以使用wait()或waitpid()等待子进程结束
}
另一个更偷懒的办法是 system() 函数。它直接调用Shell去执行一条命令,底层其实也是 fork + exec 的封装。好处是简单粗暴,坏处是安全性差、容易受环境变量影响,而且会阻塞父进程——所以生产环境最好慎用。
#include
int ret = system("ls -l");
if (ret == -1) {
// 错误处理
}
进程创建出来之后,真正头疼的往往是通信问题。Linux 提供了管道、命名管道、信号、消息队列、共享内存、信号量等多种IPC机制,选哪种取决于场景和性能要求。比如管道适合父子进程间简单传递数据,共享内存则适合高频大数据量的交换。
有通信就会遇到同步。多个进程同时读写共享资源,不出竞争条件才怪。这时候就需要互斥锁、条件变量、读写锁这些东西来镇场子。Linux 的 POSIX 线程库(pthread)提供的同步原语不仅适用于线程,也适用于进程间的同步(只要把互斥锁属性设成进程共享)。
进程控制这块,最常用的是 kill() 发信号,以及 wait() / waitpid() 等待子进程结束。信号就像进程之间的“小纸条”,SIGKILL是强制终结,SIGTERM是礼貌地请求退出。而 waitpid() 可以让你精确控制等待哪个子进程,还能判断子进程是正常退出还是被信号干掉的。
#include
#include
pid_t child_pid = fork();
if (child_pid > 0) {
int status;
waitpid(child_pid, &status, 0); // 等待子进程结束
if (WIFEXITED(status)) {
// 子进程正常退出
}
} else if (child_pid == 0) {
// 子进程
} else {
// 错误处理
}
// 发送信号给进程
kill(pid, SIGTERM);
最后提一嘴,C++11 的标准线程库 虽然不算是Linux特有的进程管理工具,但在多线程编程里非常实用。注意线程和进程的区别:线程共享地址空间,进程有独立的地址空间。如果只是在单个进程里做并发,用 std::thread 会比搞一堆进程轻量得多。
#include
void thread_function() {
// 线程执行的代码
}
int main() {
std::thread t(thread_function);
t.join(); // 等待线程完成
return 0;
}
写这些代码的时候,一定要盯紧权限问题、系统调用的返回值,以及各种边界情况。Linux 的系统调用手册(man pages)是最好的老师,遇到不熟悉的函数,先翻翻它比什么都强。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8