我正在尝试为Linux上运行的程序编写多线程日志记录系统。
在主程序线程中对日志记录系统的调用会将包含要记录的数据的数据结构推送到FIFO队列中。专用线程选择队列中的数据并输出数据,而程序主线程继续执行其任务。
如果主程序导致SIGSEGV或其他信号发出,我需要在终止之前确保队列为空。
我的计划是使用除一个线程外的所有线程使用pthread_sigmask http://man7.org/linux/man-
pages/man3/pthread_sigmask.3.html
阻止信号,但读取http://man7.org上的信号列表/linux/man-
pages/man7/signal.7.html
我注意到:
可能会为整个过程(例如,使用kill(2)发送时)或特定线程(例如,某些信号,例如SIGSEGV和SIGFPE)生成信号(从而挂起),从而执行特定机器语言指令的过程是线程定向的,使用pthread_kill(3)锁定特定线程的信号也是如此。
如果我在所有线程(除了专用于捕获信号的线程)上阻塞了SIGSEGV,那么它将捕获由另一个线程引发的SIGSEGV吗?
我在Linux中发现了使用多个线程进行信号处理的问题,但是对于哪些信号是线程特定的以及如何捕获它们,我一无所知。
我同意以下意见:在实践中,捕获和处理SIGSEGV
通常是一件坏事。
并SIGSEGV
传递到 _特定_线程,该线程运行访问了非法地址的机器指令。
因此,您无法运行专用于捕获SIGSEGV
其他线程的线程。而且您可能无法轻易将signalfd(2)用于SIGSEGV
…
捕获(并从其信号处理程序正常返回)SIGSEGV
是一件复杂且 特定于处理器的
事情(它不能是“便携式C代码”)。您需要检查和更改处理程序中的机器状态,即修改地址空间(通过调用mmap(2)等)或修改当前线程的寄存器状态。因此,将sigaction(2)与一起使用,SA_SIGINFO
并更改ucontext_t*
信号处理程序的第三个参数(类型为)所指向的机器特定状态。然后深入到
处理器的特定
uc_mcontext
领域。乐于更改单个寄存器,等等…如果您不更改错误线程的机器状态,则恢复执行(从您的线程返回后SIGSEGV
处理程序),并且SIGSEGV
立即发送另一个信号。…或者简单地,不要正常从SIGSEGV
处理程序返回(例如,使用siglongjmp(3)或abort(3)或_exit(2) … )。
即使您碰巧做到了所有这些,也有传言说Linux内核在这种执行中效率不是很高。因此,有传言称,在Linux上以这种方式模仿Hurd /Mach外部寻呼机并不是很有效。 …
当然,信号处理程序应该只调用异步信号安全函数(有关更多信息,请参见signal(7))。特别是,原则上您不能fprintf
从他们那里打电话(并且您可能无法 可靠地
使用您的日志记录系统,但是它可以在大多数情况下(但不是在所有情况下)工作)。
我所说的SIGSEGV
还适用于SIGBUS
和SIGFPE
(以及其他特定于线程的异步信号,如果它们存在的话)。
问题内容: 我想编写一个信号处理程序来捕捉SIGSEGV。我保护一块内存以供使用 这样可以保护从缓冲区开始的内存的页面大小字节免受任何读取或写入的影响。 其次,我尝试读取内存: 这将生成一个SIGSEGV,并且将调用我的处理程序。到目前为止,一切都很好。我的问题是,调用处理程序后,我想通过以下方式更改内存的访问写入: 并继续正常运行我的代码。我不想退出该功能。在将来对同一内存进行写操作时,我想再次
问题内容: 如何捕捉到不同的信号,如和斯威夫特是否正确?例如,当人们通过按- 停止我的脚本时,我想在终止脚本之前进行一些清理。 问题答案: 调度源 可用于监视UNIX信号。 这是一个简单的示例,《 并发编程指南 》中“监视信号”部分中C代码的Swift 3转换 。 请注意,这需要一个活动的GCD事件循环,例如 在命令行程序中。
我有一个最小的Android应用程序,使用启用了c支持的新项目向导创建。该应用程序的目的是允许c在捕获信号(SIGSEGV)后回调到java中。程序的顺序简短而甜蜜,伪代码就像这样: < li >输入本机方法< code>handleSegv() < ol > < li >本机代码回调到java中作为测试 < li >本机代码设置SIGSEGV处理程序 本机代码引发/发送SIGSEGV < li
问题内容: 这应该非常简单,并且令我感到惊讶的是,我还没找到关于stackoverflow的答案。 我有一个类似程序的守护程序,该程序需要响应SIGTERM和SIGINT信号才能与新贵一起正常工作。我读到最好的方法是在与主线程不同的线程中运行程序的主循环,并让主线程处理信号。然后,当接收到信号时,信号处理程序应通过设置通常在主循环中检查的哨兵标志来告诉主循环退出。 我已经尝试过这样做,但是它没有按
在Linux中,当一个程序(可能有多个线程)收到信号(如SIGTERM或SIGHUP)时会发生什么? 哪个线程拦截信号?多个线程可以获得相同的信号吗?是否有专门处理信号的特殊线程?如果没有,那么处理信号的线程内部会发生什么?信号处理程序例程完成后,执行如何继续?
问题内容: 我正在使用来自Guava的ListenableFuture,关于它们的一件好事是,将Executor传递给该方法,即要求在给定的线程/执行器上执行回调。 在我的Android应用程序中,我希望能够基于UI线程启动异步执行,并计划一个也在UI线程上执行的回调。因此,我想以某种方式将UI线程执行器提交给上述方法。如何实现呢? 或者,换句话说,我想要UI线程的执行程序。它已经在Android