处理segfault信号SIGSEGV需要使用siginfo_t确定segfault的原因

2024-04-04

我正在为 pthread 库制作一个包装器,它允许每个线程拥有自己的一组非共享内存。现在,如果任何线程尝试读取另一个线程的数据,程序就会出现段错误。这很好,我可以用叹息者抓住它并打电话pthread_exit()并继续执行该程序。

但并不是所有的段错误都是由坏的 RWE 造成的。我需要找到一种方法来使用 siginfo 类型来确定段错误是否是错误的编程或此错误。有任何想法吗?

由于我使用 mmap 来管理内存页面,我认为使用si_addr in siginfo会帮助我的。


听起来您真正想要的是线程本地存储,它已经比这更便携地解决了。海湾合作委员会提供__thread, MSVC 提供__declspec(thread). 提升::线程 http://www.boost.org/doc/libs/1_44_0/doc/html/thread/thread_local_storage.html根据平台/工具链等,使用各种机制提供可移植的线程本地存储。

如果你真的想走这条路,它是可行的,但这条路充满了危险。从 SIGSEGV 中恢复在技术上是未定义的行为,尽管它可以在相当多的平台上工作,但它既不健壮也不可移植。不过,您也需要非常小心在信号处理程序中所做的事情 - 列表异步安全 https://www.securecoding.cert.org/confluence/display/seccode/SIG30-C.+Call+only+asynchronous-safe+functions+within+signal+handlers函数,即可以从信号处理程序合法安全调用的函数非常小。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理segfault信号SIGSEGV需要使用siginfo_t确定segfault的原因 的相关文章

  • 我的功率谱可信吗? lomb-scargle 和 fft 之间的比较(scipy.signal 和 numpy.fft)

    谁能指出为什么我得到截然不同的结果 有很多不应该出现的峰 事实上 应该只有一个峰 我是一个 python 新手 欢迎对下面我的代码发表所有评论 测试数据在这里 在此输入链接描述 https clbin com YJkwr您可以直接wget
  • C 中的递归深度是否有任何硬连线限制

    正在讨论的程序尝试计算sum of first n natural numbers using recursion 我知道这可以使用一个简单的公式来完成n n 1 2但这里的想法是使用recursion 程序如下 include
  • 处理segfault信号SIGSEGV需要使用siginfo_t确定segfault的原因

    我正在为 pthread 库制作一个包装器 它允许每个线程拥有自己的一组非共享内存 现在 如果任何线程尝试读取另一个线程的数据 程序就会出现段错误 这很好 我可以用叹息者抓住它并打电话pthread exit 并继续执行该程序 但并不是所有
  • POSIX 线程何时取消不是立即的?

    POSIX 指定了两种线程取消类型 PTHREAD CANCEL ASYNCHRONOUS and PTHREAD CANCEL DEFERRED 通过设置pthread setcanceltype 3 确定何时pthread cancel
  • 如何为 keras lstm 输入重塑数据?

    我是 Keras 新手 我发现很难理解 LSTM 层输入数据的形状 Keras 文档表示输入数据应该是形状为 nb samples timesteps input dim 的 3D 张量 我有808信号 每个信号有22个通道和2000个数据
  • 在 Linux 中何时使用 pthread_exit() 以及何时使用 pthread_join()?

    我是 pthreads 的新手 我正在尝试理解它 我看到了一些例子 如下所示 我可以看到main 被 API 阻止pthread exit 而且我见过 main 函数被 API 阻塞的例子pthread join 我无法理解何时使用什么 我
  • 调用 sdp_record_register() 时出现分段错误

    我正在尝试使用 BlueZ 在 SDP 中注册我的蓝牙服务 我跟随this http people csail mit edu albert bluez intro x604 html教程 代码编译成功 但当我运行它时 出现分段错误 即使是
  • pthread_join() 用于异步线程

    我写了一个简单的演示程序 以便我可以理解pthread join 功能 我知道如何使用pthread condition wait 函数允许异步线程 但我试图了解如何使用pthread join 功能 在下面的程序中我通过线程1s ID t
  • 在 C 中捕获 Ctrl-C

    How does one catch Ctrl C in C 使用信号处理程序 这是一个简单的例子 翻转bool用于main include
  • 在自己的处理程序中捕获信号

    include
  • pctl(PR_SET_PDEATHSIG) 竞争条件

    据我了解 当父进程死亡时终止子进程的最佳方法是通过prctl PR SET PDEATHSIG 至少在 Linux 上 父进程退出后如何让子进程终止 https stackoverflow com questions 284325 how
  • Python 代码调用创建 OS 线程的 C 库,最终调用 Python 回调

    如果当操作系统分派另一个调用 Python 回调的线程时 唯一的 Python 解释器正在执行字节码 会发生什么 我对这种设计的可靠性的担忧是否正确 一般情况下 C库需要调用PyEval InitThreads 在生成任何调用 python
  • 如何保证清理代码在 Windows C++ 中运行(SIGINT、错误分配和关闭窗口)

    我有一个 Windows C 控制台程序 如果我不调用ReleaseDriver 在我的程序结束时 某些硬件会进入错误状态 并且在不重新启动的情况下无法再次使用 我想确定一下ReleaseDriver 即使程序异常退出 例如如果我点击Ctr
  • Mac/iPhone:有没有一种方法可以在不使用 Objective-C 的情况下获取线程标识符?

    有没有一种方法可以获取当前正在运行的线程的任何类型的线程标识符 而无需借助 Objective C 的 NSThread 我正在改进我们的自定义调试跟踪系统以正确处理多个线程 对于跟踪输出的每一行 我想打印线程 ID 或线程名称 线程可以通
  • 如果从 Java 启动,子进程将忽略 SIGQUIT

    举这个简单的例子 public class Main public static void main String args throws Exception Runtime getRuntime exec sleep 1000 This
  • 高效快速的线程参数方法

    创建带参数的线程最有效的方法是什么 参数是一个结构体 如果该结构体不能保留在父线程堆栈上 有两种解决方案 具有动态内存分配 struct Arg int x int y void my thread void v arg Arg arg A
  • 数百个空闲线程的影响

    我正在考虑使用可能数百个线程来实现通过网络管理设备的任务 这是一个在带有 Linux 内核的 powerpc 处理器上运行的 C 应用程序 在每个任务进行同步以将数据从设备复制到任务的初始阶段之后 任务变得空闲 并且仅在收到警报或需要更改一
  • 如何随时暂停 pthread?

    最近我开始将 ucos ii 移植到 Ubuntu PC 上 我们知道 在pthread的回调函数中的 while 循环中简单地添加一个标志来执行暂停和恢复是不可能模拟ucos ii中的 进程 的 如下解决方案 因为ucos ii中的 进程
  • 完成后关闭线程

    完成后如何关闭线程 比如确保没有任何东西再打开或运行 到目前为止我知道如何打开它 但是 不知道如何正确关闭它 int iret1 pthread t thread1 char message1 void multithreading1 vo
  • RSpec 抛出分段错误

    有时我的测试套件会无缘无故地抛出分段错误 这是输出 Users Test rvm gems ruby 1 9 3 p392 gems activerecord 3 2 9 lib active record relation query m

随机推荐