进程创建
fork
进程终止
man perror(错误码)
man 3 perror
哪些情况?
正常退出(echo $? 查看程序的退出码)
从main函数return退出
调用exit
_exit
exit 会刷新缓冲区,执行atexit(fun)定义的清理函数
_exit 不会刷新缓冲区
atexit(fun)
异常退出
内存访问越界
访问空指针
进程等待
wait: 头文件 <sys/wait.h>
pid_t wait(int status)
返回值 : 正常 > 0
异常 -1
参数: int status
输入型参数 int
输出型参数 int&
输入输出型 int*
阻塞 非阻塞
阻塞 : 发起一个调用, 条件没有具备,就一直等待
非阻塞 : 发起一个调用,条件没有具备,就返回一个结果
pid_t waitpid(pid_t pid, int* status, int options)
返回值:
失败 -1
没有等待子进程退出 0
等待到子进程退出 >0
参数 : -1 等待任一子进程
>0 等待特定的子进程
options:
0 阻塞
WNOHANG 非阻塞
用非阻塞去等待子进程退出,搭配while使用
获取进程status(16个比特位)
正常退出 (st>>8)&0XFF
异常退出st&0X7F
进程程序替换
替换函数
原理: 替换数据段和代码段为替换程序的数据段和代码段,并更新堆栈信息
exec函数 (只有在函数执行失败的时候才会返回值, 返回-1)
int execl(const char* path, const char* arg…)
带l: 可变参数列表
path : 要替换程序的路径/建议绝对路径
arg :
先写可执行程序的名称
以NULL结尾
int execlp(const char* file, const char* arg…)
带p : 以直接给程序的名称,自动搜索环境变量
file可以直接给程序的名称,也可以带上路径
int execle(const char* path, const char* arg…,char* const envp)
带e:需要自己组织环境变量的内容
envp:给当前所要替换的程序设置环境变量
int execv(const char *path, char *const argv[])
带v : 参数用数组,以NULL结尾
int execvp(const char *file, char *const argv[])
前五个都是库函数,最终都会调用execve
int execve(const char *file, char *const argv[]) 系统调用