【发布时间】:2013-12-16 18:28:00
【问题描述】:
我正在尝试为在 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 吗?
我找到了Signal handling with multiple threads in Linux 的问题,但我不知道哪些信号是线程特定的以及如何捕获它们。
【问题讨论】:
-
三十年来我一直认为程序不应该捕获 SIGSEGV:它们应该被调试。
-
我同意。捕获 SIGSEGV 或类似系统的全部目的是从程序中获取最后记录的信息,以帮助找到导致程序首先失败的错误。
-
所以暂时禁用日志系统中的缓冲,运行程序,查看日志,调试程序。
-
您是否尝试在信号处理程序中等待记录器的队列变空,然后继续正常操作? Justa 的问题,不知道这是否可能。
-
如果您的程序正在抛出 SIGSEGV(或 SSIGBUS),那么您在没有特定仪器的情况下就在某条小溪上。我认为游戏结束了
标签: c++ linux multithreading posix