Pthreads 处理SEGFULT信号SIGSEGV需要使用siginfo\u t确定SEGFULT的原因

Pthreads 处理SEGFULT信号SIGSEGV需要使用siginfo\u t确定SEGFULT的原因,pthreads,signals,segmentation-fault,Pthreads,Signals,Segmentation Fault,我正在为pthread库制作一个包装器,它允许每个线程拥有自己的非共享内存集。现在,c的设置方式是,如果任何线程试图向另一个线程发送数据,则程序SEGFULTS。这很好,我可以用一个sighandler捕捉它并调用pthread\u exit()继续执行程序 但并不是所有的赛格故障都是坏rwe的结果。我需要找到一种方法来使用siginfo类型来确定SEGFULT是编程错误还是此错误。有什么想法吗 因为我使用mmap来管理内存页,所以我认为在siginfo中使用si_addr将对我有所帮助。听起来

我正在为pthread库制作一个包装器,它允许每个线程拥有自己的非共享内存集。现在,c的设置方式是,如果任何线程试图向另一个线程发送数据,则程序SEGFULTS。这很好,我可以用一个sighandler捕捉它并调用
pthread\u exit()
继续执行程序

但并不是所有的赛格故障都是坏rwe的结果。我需要找到一种方法来使用siginfo类型来确定SEGFULT是编程错误还是此错误。有什么想法吗


因为我使用mmap来管理内存页,所以我认为在
siginfo
中使用
si_addr
将对我有所帮助。

听起来你真正想要的是线程本地存储,它已经解决了比这更便携的问题。GCC提供
\uuuu线程
,MSVC提供
\uuu declspec(线程)
。根据平台/工具链等,使用各种机制提供便携式线程本地存储

如果你真的想沿着这条路走下去,你可以让它工作,但是这条路充满了危险。从SIGSEGV恢复在技术上是未定义的行为,尽管它可以在很多平台上工作,但它既不健壮,也不可移植。不过,您也需要非常小心在信号处理程序中执行的操作——函数列表,即可以从信号处理程序安全调用的函数列表非常小

在过去,我已经成功地使用过几次这个技巧,通常用于在用户空间中将“页面”标记为“脏”。我这样做的方法是建立一个哈希表,其中包含我感兴趣的所有内存“页面”的基址。当您在处理程序中捕获SIGSEGV时,您可以通过简单的算术运算将地址映射回页面。如果可以在没有锁的情况下读取哈希表,那么您可以查找您关心的页面或其他地方的segfault,并决定如何操作