20250826的学习笔记
一、wait
pid_t wait(int *status);
功能:
该函数可以阻塞等待任意子进程退出并回收该进程的状态。一般用于父进程回收子进程状态。
参数:
status进程退出时候的状态
注:
如果不关心其退出状态一般用NULL表示。
如果要回收进程退出状态,则用WEXITSTATUS回收。
返回值:
成功 回收的子进程pid
失败 -1;
宏 | 描述 | 用法 |
WIFEXITED(status) | 子进程正常退出 | if (WIFEXITED(status)) { ... } |
WEXITSTATUS(status) | 获取退出状态码 | int exit_code = WEXITSTATUS(status); |
WIFSIGNALED(status) | 子进程被信号终止 | if (WIFSIGNALED(status)) { ... } |
WTERMSIG(status) | 获取终止信号的编号 | int signal = WTERMSIG(status); |
WIFSTOPPED(status) | 子进程被暂停 | if (WIFSTOPPED(status)) { ... } |
WSTOPSIG(status) | 获取暂停信号的编号 | int signal = WSTOPSIG(status); |
WIFCONTINUED(status) | 子进程已继续运行 | if (WIFCONTINUED(status)) { ... } |
注:
1)如果所有的子进程都在运行,在阻塞
2)如果一个子进程终止,正在等待的父进程则获得终止状态,获得子进程的状态后,立刻返回。
3)如果没有子进程,则立即出错退出。
二、waitpid
pid_t waitpid(pid_t pid, int *status, int options);
功能:
用于等待特定子进程状态改变并获取其信息的核心系统调用
参数:
pid_t pid:
① < -1 回收指定进程组内的任意子进程
② -1 回收任意子进程,组内外
③ 0 回收和当前调用waitpid一个组的所有子进程,组内
④ >0 回收指定ID的子进程
eg:waitpid (-1,a,0) == wait(a);
status:
子进程退出时候的状态,如果不关注退出状态用NULL。
options 选项:
0表示回收过程会阻塞等待
WNOHANG 表示非阻塞模式回收资源。
返回值:
成功 返回接收资源的子进程pid
失败 -1
三、exec
exec系列函数是 Linux/Unix 系统编程中至关重要的一组函数。它们用于将当前进程的映像替换为一个新的程序。理解 exec
是理解进程创建和系统命令执行的基础。
核心概念
不是创建新进程:
exec
不会创建一个新的进程。它是在当前进程的上下文中,停止执行原有的程序代码,转而加载并执行一个新的程序。进程ID不变:调用
exec
后,进程ID(PID)、父进程ID(PPID)、文件描述符、信号处理方式等大部分属性保持不变,但进程的代码段、数据段、堆栈段被新程序完全替换。成功不返回:如果
exec
函数执行成功,它永远不会返回,因为原来的代码已经被替换了。失败才返回:只有发生错误时(如找不到要执行的程序),
exec
才会返回-1
,并设置errno
。
exec 函数家族
exec
函数族有多个变体,它们功能相同(都是加载新程序),但参数传递方式不同。名字中的字母揭示了它们的区别:
函数原型 | 参数查找方式 | 是否使用环境变量 | 参数传递方式 |
---|---|---|---|
| 路径 | 否 | 列表 (List) |
| 路径 | 否 | 数组 (Vector) |
| 路径 | 否 | 列表 + 环境变量 |
| 路径 | 否 | 数组 + 环境变量 |
| 文件名 | 是 | 列表 |
| 文件名 | 是 | 数组 |