Day28

进程的终止

正常终止:在main函数中返回,返回值即进程退出码

  1. 调用exit函数终止

#include <stdlib.h>

void exit(int status);

功能:使进程终止

参数:status 输出型参数,进程退出码,相当于main函数返回值

⭐status是int类型,但是实际只能存储一个字节内容,高3个字节会被忽略

⭐终止进程前做的收尾工作

  1. 调用通过atexit和on_exit函数注册的退出处理函数(一次性收尾工作放此处)
  2. 冲刷并关闭所有I/O流(如将缓冲区的内容冲刷到屏幕输出)
  3. 删除所有通过tmpfile函数创建的临时文件
  4. _exit(status);

通常使用宏作为参数

EXIT_SUCCESS EXIT_FAILURE

     0               -1

  1. 调用_exit/_Exit函数终止

#include <unistd.h>

void _exit(int status);

参数:status 函数退出码

收尾步骤:

  1. 关闭所有文件描述符
  2. 将所有子进程托孤给init进程
  3. 向该进程的父进程发送SIGCHLD(17)信号
  4. 令进程终止并将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

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值