信号处理在关键部分

时间:2014-08-29 13:28:38

标签: c signals critical-section reentrancy

练习

根据我的理解,人们可能希望允许代码的关键部分不间断地运行。

可以通过阻止标准信号等中断来实现。

冲突:

我如何能够处理从关键部分代码中发生的故障/标准信号。 我能想到的一个典型例子是分配内存失败。 甚至更好,由于无效地址而无法释放内存。 来自" alloc / free"的内存操作我理解的部分属于临界部分。

我尝试了什么:

我确实试图四处搜寻,并研究信号和重入的主题, 然而,我偶然发现了这场冲突。

一些输入会很棒,提前谢谢。

1 个答案:

答案 0 :(得分:2)

POSIX信号,返回代码和异常是不同的东西。

  

要在不中断的情况下运行的关键代码段

准确地说,关键部分是由互斥锁保护的代码块。也就是说,一次只能有一个线程进入临界区。

  

我如何能够处理从关键部分代码中发生的故障/标准信号。我能想到的一个典型例子是分配内存失败。

失败时malloc返回NULL,此处不涉及任何信号。

  

甚至更好,由于地址无效而无法释放内存。

代码无法处理此类错误。这是一个编程错误,必须尽早发现并修复。发现此类错误的最佳工具之一是Valgrind

因为当您收到SIGSEGVSIGBUSSIGILLSIGFPE信号时,您的进程地址空间的状态是不确定的,代码可能已损坏所有进程内存在生成SIGSEGV时,所以在收到此信号后没有好方法可以恢复程序的正确状态。