如果在取消点上调用信号处理程序,会发生什么情况?
|
假设在取消点(例如“ 0”)处阻止了应用程序,并且接收到信号并调用了信号处理程序。 Glibc / NPTL通过在系统调用期间启用异步取消来实现取消点,据我所知,异步取消将在信号处理程序的整个期间保持有效。当然,这将是完全错误的,因为有许多函数不是异步取消安全的,但是从信号处理程序调用时必须安全。
这给我留下了两个问题:
我是错了吗,还是glibc / NPTL行为确实被危险地破坏了?如果是这样,那么这种危险行为是否合规?
根据POSIX,如果在进程执行作为取消点的函数的过程中调用信号处理程序,应该发生什么?
编辑:我几乎已经说服自己,任何可能是ѭ1的目标的线程都必须确保在该线程的上下文中永远不能从信号处理程序中调用取消点的函数:
一方面,可以在可能被取消的线程中调用并且使用任何异步取消不安全函数的任何信号处理程序必须在调用任何作为取消点的函数之前禁用取消。这是因为,从信号中断的代码的角度来看,任何这种取消都将等同于异步取消。另一方面,信号处理程序不能禁用取消,除非调用信号处理程序时将运行的代码仅使用异步信号安全功能,因为
pthread_setcancelstate
不是异步信号安全功能。
没有找到相关结果
已邀请:
3 个回复
稀瓣囊
逆捐凶撤小
娠频摩
)的调用中,以防止它们被中断。重新启用信号后,在阻塞状态下接收到的所有信号都将被传送。但是,与中断一样,如果阻塞时间太长,则可能由于覆盖而错过一些中断(多次接收到相同信号视为一个待处理信号)。