ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux 进程退出exit(函数)

Linux 进程退出exit(函数) 一、进程退出两大类1. 正常退出主动自杀进程主动结束自身进程主动执行退出逻辑自行结束生命周期主要分为三种方式main函数return、标准库exit()、系统调用_exit()。1main 函数 returnmain 的return n等价于调用exit(n)。普通函数里的 return 只是函数返回不会结束进程。只有 main 函数的 return 会触发完整进程退出流程结束进程、刷新 IO 缓冲区、回收进程资源。2库函数 exit() 标准库退出头文件#include stdlib.hvoid exit(int status);status进程退出码标识退出状态。0 代表正常退出非 0 代表异常退出可由父进程wait()获取。执行流程带完整用户层清理刷新标准 IO 缓冲区将 printf、文件缓存数据落盘或输出到终端调用atexit()注册的退出钩子函数最终调用底层系统调用_exit()由内核真正终止进程。3系统调用 _exit() 直接内核终止头文件#include unistd.hvoid _exit(int status);直接进入内核销毁进程完全跳过用户层清理工作不刷新 IO 缓冲区、不执行 atexit 回调缓冲区未落地数据直接丢失会出现 printf 无打印现象。关键示例对比示例 1_exit 丢失缓存无打印#include stdio.h #include unistd.h int main() { printf(hello world); // 数据存在缓冲区未换行不刷新 _exit(0); return 0; }运行结果终端无任何输出示例 2exit 自动刷新缓存正常打印#include stdio.h #include stdlib.h int main() { printf(hello world); exit(0); return 0; }运行结果终端输出 hello world补充小知识点如果 printf 末尾加换行\n标准行缓冲会强制刷新此时 _exit 也能正常打印内容printf(hello world\n); _exit(0); // 能正常输出换行触发缓冲区刷新2. 非正常退出被动他杀外部 / 异常强制终止进程没有主动调用任何退出函数由程序异常或外部信号干涉被强制杀死。分为两类场景1程序运行异常崩溃段错误 SIGSEGV访问非法内存、空指针、数组越界总线错误 SIGBUS非法地址对齐访问、访问无效硬件地址浮点错误 SIGFPE除数为 0、浮点运算溢出2外部发送终止信号kill 进程PID发送 SIGTERM 温柔杀死进程可捕获信号、执行收尾工作kill -9 进程PID发送 SIGKILL 强制杀死进程无法捕获、无法清理内核直接销毁进程二、exit / _exit / main return 核心差异表方式刷新 IO 缓冲区执行 atexit 钩子层级main 函数 return是执行用户层封装exit()是执行标准库函数_exit()否不执行系统调用三、拓展补充考点退出码取值规则退出码仅低 8 位有效有效范围 0~255父进程通过wait/waitpid获取退出状态。缓冲区本质printf 是标准库封装数据存放在用户态缓冲区_exit直接进入内核销毁进程丢弃用户态缓存exit在调用内核接口前主动刷新缓冲区。fork 子进程场景子进程结束推荐使用_exit避免刷新父子共享的缓冲区造成数据重复输出、日志错乱问题。
返回列表