Linux下进程接收SIGKILL信号的行为及与std::exit()的差异
Linux进程接收SIGKILL的行为及与std::exit()的差异
一、进程接收SIGKILL信号的行为
当进程接收到SIGKILL信号后,内核例程处理完毕时,进程状态会从“dying”转为“dead”,内核随即开始对其进行清理,该清理过程与程序正常退出时的流程类似。清理完成后,进程会被分配一个大于128的返回码(用于表明进程是被信号终止),之后进入“僵尸(zombie)”状态。
二、接收SIGKILL信号与调用std::exit()的核心差异
调用std::exit()时的行为
调用std::exit()会触发C++运行时的一系列用户态清理操作,这些操作会被并发执行:
- 执行当前线程关联的线程局部存储(thread local storage)对象的析构函数
- 执行静态存储(static storage)对象的析构函数
- 执行通过
std::atexit()注册的退出函数
接收SIGKILL信号时的行为差异
进程接收到SIGKILL信号时,内核会直接终止进程并完成内核层面的资源清理,不会触发任何C++运行时的用户态清理逻辑——既不会执行对象的析构函数,也不会调用通过std::atexit()注册的函数。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

