glibc 2.27之前版本中abort()是否不具备异步信号安全性?
glibc 2.27之前的
abort()是否具备异步信号安全性? 是的,glibc 2.27之前版本的abort()并不符合异步信号安全的要求,原因如下:
- POSIX标准明确要求
abort()必须是异步信号安全函数,但早期glibc的实现违背了这一规范:在进程终止前,它会调用非异步信号安全的fclose()来刷新并关闭所有打开的stdio流。 - 异步信号安全的核心准则是:函数不能调用任何非异步信号安全的接口,也不能访问非线程安全的全局数据。
fclose()操作stdio流的内部缓冲区结构时并非原子操作,若在信号处理函数中触发旧版abort(),极有可能和主线程的stdio操作产生竞争,引发进程崩溃或未定义行为。 - 这和
exit(3)不具备异步信号安全性的原因本质一致:exit()会执行刷新缓冲区、调用终止处理函数等非安全操作,因此不能在信号处理函数中使用;而旧版abort()同样做了缓冲区刷新操作,自然不满足异步信号安全的条件。 - glibc 2.27版本对
abort()的实现进行了修改,移除了刷新关闭stdio流的逻辑,使其符合POSIX的异步信号安全要求。
内容的提问来源于stack exchange,提问作者Jia Cheng Sun
相关产品推荐
相关产品推荐

