进程的终止
正常终止:在main函数中返回,返回值即进程退出码
- 调用exit函数终止
#include <stdlib.h>
void exit(int status);
功能:使进程终止
参数:status 输出型参数,进程退出码,相当于main函数返回值
⭐status是int类型,但是实际只能存储一个字节内容,高3个字节会被忽略
⭐终止进程前做的收尾工作
- 调用通过atexit和on_exit函数注册的退出处理函数(一次性收尾工作放此处)
- 冲刷并关闭所有I/O流(如将缓冲区的内容冲刷到屏幕输出)
- 删除所有通过tmpfile函数创建的临时文件
- _exit(status);
通常使用宏作为参数
EXIT_SUCCESS EXIT_FAILURE
0 -1
- 调用_exit/_Exit函数终止
#include <unistd.h>
void _exit(int status);
参数:status 函数退出码
收尾步骤:
- 关闭所有文件描述符
- 将所有子进程托孤给init进程
- 向该进程的父进程发送SIGCHLD(17)信号
- 令进程终止并将status低八位作为退出码保存在终止状态
------------------------------------------------------------
#include <stdlib.h>
void _Exit(int status);
参数:status 函数退出码
异常终止
SIGILL(4) 进程试图执行非法指令
SIGBUS(7) 硬件或对齐错误
SIGFPE(8) 浮点异常
SIGSEGV(11) 无效内存访问
SIGPWR(30) 系统供电不足
SIGINT(2) CTRL+C
SIGQUIT(3) CTRL+\
SIGKILL(9) 不能被捕获或忽略的进程终止信号
SIGTERM(15) 可以被捕获或忽略的进程终止信号
向进程自己发送信号
#include <stdlib.h>
void abort(void);
功能:向调用进程发送SIGABRT(6)信号,可使进程结束
注册退出处理函数
#include <stdlib.h>
int atexit(void(*function)(void));
参数:function 指向退出处理函数
返回值:成功返回0,失败返回-1
#include <stdlib.h>
int on_exit(void(*function)(int, void*), void*arg);
参数:function 函数指针,指向退出处理函数,其第一个参数为函数退出码,第二个参数 来自传递给on_exit函数的arg参数
arg 泛型指针,将第二个参数传递给function所指向的退出处理函数
返回值:成功返回0,失败返回-1
回收子进程
#include <sys/wait.h>
pid_t wait(int* status);
功能:等待并回收最近终止的子进程(阻塞型函数)
参数:status 用于输出终止状态,可置NULL
返回值:成功返回子进程PID,失败返回-1
----------------------------------------------------------------------------------
分析终止状态的工具宏
WIFEXITED(status)
真:正常终止 WEXITSTATUS(status) -> 进程退出码
假:异常终止 WTERMSIG(status) -> 终止进程的信号
WIFSIGNALED(status)
假:正常终止 WEXITSTATUS(status) -> 进程退出码
真:异常终止 WTERMSIG(status) -> 终止进程的信号
-------------------------------------------------------------------------------------
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int* status, int options);
功能:等待并回收任意或特定子进程
参数:pid -1 回收任意子进程
>0 回收特定pid子进程
status 输出终止状态,可置NULL
options 0 阻塞模式
WNOHANG 非阻塞模式,子进程仍在执行返回0
返回值:成功返回子进程的PID或0,失败返回-1