进程的创建
pid_t fork(void)
功能: 创建新的进程
头文件: <unistd.h>
返回值: 给父进程返回子进程的pid, 给子进程返回0, 失败返回-1
特点: 父子进程代码共享, 若子进程发生写操作(OS进行写时拷贝)
进程的终止
1.进程常见的退出方式
- 代码跑完退出
- 结果正确
- 结果不正确(可以查看退出码定位出错原因)
- 如: return退出, exit函数退出
- 代码没跑完,程序崩溃(此时退出码无意义)
- 如: 信号终止(可以查看退出信号)
2.操作
void exit(int status);
功能: 进程的退出
头文件:<unistd.h>
参数:status 定义了进程的终止状态,父进程通过wait来获取该值
进程的等待
1.功能
- 回收子进程资源(可以解决僵尸进程问题)
- 关心派发给子进程的任务完成情况(是否正常, 正确)通过退出码, 退出信号
2.操作
pid_t wait(int*status);
头文件: <sys/types.h>, <sys/wait.h>
返回值:成功返回被等待进程pid,失败返回-1。
参数:获取子进程退出状态,不关心则可以设置成为NULL(输出型参数)
pid_ t waitpid(pid_t pid, int *status, int options);
头文件: <sys/types.h>, sys/wait.h>
返回值:
正常返回收集到的子进程的id
出错返回-1, 这时errno会被设置成相应的值以指示错误所在
参数:
pid 为-1表示等待任意一个子进程, >0为等待指定的子进程
status: 状态码(次第8位):(status>>8)&0xFF. 信号(低7位):status & 0x7F
options: 默认为0:阻塞等待 WNOHANG:非阻塞等待,若没有子进程可以等就返回0
WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)
WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)
进程的替换
1.概念
程序替换:是通过特定的接口,加载磁盘上一个全新的程序(代码+数据)
2.原理
3.操作
exec系列函数
- 头文件<unistd.h>
- int execl(const char *path, const char *arg, ...);
- int execlp(const char *file, const char *arg, ...);
- int execle(const char *path, const char *arg, ...,char *const envp[]);
- int execv(const char *path, char *const argv[]);
- int execvp(const char *file, char *const argv[]);
- int execve(const char *path, char *const argv[], char *const envp[]);
命名解释
- l (list) : 表示参数采用列表
- v(vector) : 参数用数组
- p(path) : 有p自动搜索环境变量PATH
- e(env) : 表示自己维护环境变量
返回值
- 成功就没有返回值(进程已被替换)
- 失败返回-1
场景
- bash的简单实现(命令解释器)
- 父进程读取数据分析, 子进程执行指令
- 创建子进程来执行exec系列函数(执行其程序的功能 + 保证自己不会被替换)