gpt4 book ai didi

linux - pthread_sigmask 无法与 aio 回调线程一起正常工作

转载 作者:太空宇宙 更新时间:2023-11-04 10:42:55 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

不幸的是,根据标准,"[t]he signal mask of [a SIGEV_THREAD] thread is implementation-defined."例如,在 Linux (glibc 2.12) 上,如果我在 main 中阻止 SIGUSR1,然后设法从 aio_read 调用运行 SIGEV_THREAD 处理程序,则该处理程序在 SIGUSR1 未被阻止的情况下运行。

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

关于linux - pthread_sigmask 无法与 aio 回调线程一起正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34274825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com