pthread_sigmask 无法正常使用 aio 回调线程

pthread_sigmask not working properly with aio callback threads

我的应用程序有时会从 SIGIO 或 SIGUSR1 信号终止,即使我已经阻止了这些信号。

我的主线程从阻塞 SIGIO 和 SIGUSR1 开始,然后进行 2 个 AIO 读取操作。这些操作使用线程来获取有关操作状态的通知。通知函数(作为分离线程调用)启动另一个 AIO 操作(它们操作已读取的数据并开始将其写回文件)并通过发送信号处理通知(一个操作使用 SIGIO,另一个使用 SIGUSR1)到这个流程。我通过在主线程中调用 sigwait 来同步接收这些信号。不幸的是,有时我的程序会崩溃,被 SIGUSR1 或 SIGIO 信号停止(应该被 sigmask 阻止)。

一种可能的解决方案是为它们设置 SIG_IGN 处理程序,但这并不能解决问题。它们的处理程序不应该被调用,而应该在主程序循环的下一次迭代中由 sigwait 从挂起的信号中检索它们。

我不知道哪个线程以这种方式处理这个信号。也许是 init 收到了这个信号?或者一些 shell 线程?我不知道。

我猜你的 AIO 回调线程之一或生成信号的线程正在接收信号。 (证明我错了,我会删除这个答案。)

不幸的是,根据标准,"[t]he signal mask of [a SIGEV_THREAD] thread is implementation-defined." 例如,在 Linux (glibc 2.12) 上,如果我在 main 中阻止 SIGUSR1,则设法 运行 SIGEV_THREAD 处理程序来自 aio_read 调用,处理程序 运行s 与 SIGUSR1 解锁。

这使得 SIGEV_THREAD 处理程序不适合必须可靠且可移植地处理信号的应用程序。