假设一个应用程序在取消点,例如
这让我有两个问题:我错了还是glibc / NPTL的行为确实是如此危险?如果是这样,这种危险行为是否符合标准?
根据POSIX,在进程执行取消点函数时如果调用信号处理程序应该发生什么?
编辑:我几乎已经说服自己,任何可能成为目标的线程都必须确保取消点函数永远不会从该线程的上下文中的信号处理程序中调用:
一方面,任何信号处理程序都可能在可能被取消的线程中调用,并使用任何异步取消不安全函数,则必须在调用任何取消点函数之前禁用取消操作。这是因为从信号中断的代码的角度来看,任何此类取消将等效于异步取消。另一方面,信号处理程序不能禁用取消,除非运行信号处理程序时的代码只使用异步信号安全函数,因为
read
处被阻塞,并接收到一个信号并调用信号处理程序。 Glibc / NPTL通过在系统调用期间启用异步取消来实现取消点,因此据我所知,异步取消将在整个信号处理程序的持续时间内保持有效。当然,这是极其错误的,因为有许多函数不是异步取消安全的,但需要从信号处理程序中安全调用。这让我有两个问题:
pthread_setcancelstate
不是异步信号安全的。