1. wait
与 waitpid
—— 子进程资源回收
1.1 wait
pid_t wait(int *wstatus);
功能:阻塞等待,回收任意子进程的资源空间。
参数:
wstatus
:保存子进程退出状态的变量地址
NULL
:不保存退出状态
返回值:
成功:返回回收的子进程 PID
失败:返回 -1
1.2 waitpid
pid_t waitpid(pid_t pid, int *status, int options);
功能:回收指定子进程的资源,功能比 wait
更灵活。
参数:
pid:
< -1
:回收指定进程组内的任意子进程例如 -100
表示等待 GID=100 的进程组
-1
:回收任意子进程(组内外)
0
:回收与当前调用者同一组的所有子进程
> 0
:回收指定 PID 的子进程
status:
保存子进程退出状态NULL
:不关心退出状态
options:
0
:阻塞等待WNOHANG
:非阻塞等待
返回值:
成功:返回回收的子进程 PID
失败:-1
非阻塞模式下且没有子进程退出:返回 0
1.3 子进程资源回收策略
wait 阻塞回收:父进程专门等待子进程退出
waitpid 非阻塞回收:配合轮询实现
不回收:子进程一直运行
异步回收:子进程退出时通知父进程回收
2. exec 函数族 —— 在当前进程中执行其他程序
2.1 execl
int execl(const char *path, const char *arg, ... /* (char *) NULL */);
功能:执行指定路径的可执行文件。
本质:将当前进程的代码段替换成新程序,不创建新进程。
参数:
path
:可执行文件路径
arg
:传给程序的参数,第一个参数一般是程序名
NULL
:参数结束标志
返回值:
成功:无返回(被新程序替换)
失败:-1
2.2 execlp
int execlp(const char *file, const char *arg, ... /* (char *) NULL */);
功能:从 PATH
环境变量指定的目录中查找可执行文件。
2.3 execle
int execle(const char *path, const char *arg, ..., (char *) NULL, char *const envp[]);
功能:指定环境变量执行新程序。
2.4 execv
int execv(const char *path, char *const argv[]);
功能:与 execl
类似,但用 数组 传递参数。
2.5 execvp
int execvp(const char *file, char *const argv[]);
功能:与 execlp
类似,但用 数组 传递参数。
2.6 execvpe
int execvpe(const char *file, char *const argv[], char *const envp[]);
功能:结合 PATH
搜索 + 指定环境变量。
3. system —— fork + exec 封装
int system(const char *command);
功能:调用 fork()
创建子进程,并在子进程中执行 exec
族函数。
区别:
exec:不创建新进程,直接替换当前进程代码
system:先 fork 再 exec,创建新的进程
4. 线程基础
4.1 线程概念
线程:轻量级进程,是 CPU 调度的最小单位
进程:操作系统资源分配的最小单位
4.2 进程 vs 线程
特性 | 进程 | 线程 |
---|---|---|
调度单位 | 资源分配最小单位 | CPU 调度最小单位 |
资源消耗 | 创建需分配独立虚拟地址空间(0~4G) | 仅分配栈空间(默认 8M) |
通信方式 | 需 IPC 机制 | 可直接共享全局变量 |
安全性 | 高,地址空间隔离 | 低,可能相互影响 |
创建速度 | 较慢 | 较快 |
4.3 线程创建
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
参数:
thread
:线程 ID 存放位置
attr
:线程属性(NULL
表示默认)
start_routine
:线程入口函数
arg
:传递给线程入口函数的参数
返回值:
成功:0
失败:非 0
4.4 常用线程函数
pthread_self(); // 获取当前线程 ID
pthread_exit(); // 线程主动退出
pthread_join(); // 回收线程资源
总结
wait
/ waitpid
用于子进程资源回收
exec
族函数用于执行新程序,不会创建新进程
system
封装了 fork
+ exec
线程是轻量级进程,开销小但安全性低