【发布时间】:2014-11-15 00:49:35
【问题描述】:
我想为 SIGSEGV、SIGILL 和可能的其他一些信号设置一个信号处理程序,而不是终止整个进程,而是终止有问题的线程,并可能在某处设置一个标志,以便监控线程可以抱怨并启动另一个线程。我不确定是否有安全的方法来做到这一点。 Pthreads 似乎提供了退出当前线程以及取消另一个线程的功能,但这些可能会调用一堆退出处理程序。即使他们不这样做,似乎在许多情况下它们不是异步信号安全的,尽管这些情况是可以避免的。有没有我可以调用的低级函数来破坏线程?假设我以异步信号安全的方式修改我自己的数据结构,并且没有获取互斥体,是否存在 pthread/其他全局数据结构可能仅因终止于 SIGSEGV 的线程而处于不一致状态?想到 malloc,但 malloc 本身不应该 SIGSEGV/SIGILL,除非 libc 有问题。我意识到 POSIX 在这里非常保守,并且不做任何保证。只要有办法在实践中做到这一点,我就很高兴。顺便说一句,分叉不是一种选择。
【问题讨论】:
-
使用单独的进程。一个进程中的所有线程都可以访问相同的内存空间,因此它们都可能在达到导致段错误的点之前弄乱内部数据结构(例如 malloc 和 co)。使用进程而不是线程将为您提供适当的分离。
-
malloc绝对不会在SIGSEGV中出现malloc中的错误,如果你破坏了它的数据结构的话。这是你的程序的错。
标签: c linux multithreading signals posix