2014-08-29 43 views
0

实践信号处理关键部分

从我的理解,一个可能要允许代码关键部分的运行,不会中断。

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

冲突:

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

我有什么企图:

我曾尝试搜索周围,以及学习的信号和重入主题, 但是我偶然发现了这个矛盾。

一些输入将是伟大的,在此先感谢。

+0

分配内存与信号无关。信号是由Ctrl-C或垂死的孩子引起的。 – 2014-08-29 13:38:56

+0

分配关键部分之外的内存。只更新临界区域内的指针。 – 2014-08-29 13:39:42

+0

还是内存故障?例如。 – Illasera 2014-08-29 13:40:09

回答

2

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

关键部分不中断

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

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

如果失败malloc返回NULL,没有信号这里涉及。

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

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

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

+0

谢谢,我在处理标准信号时瞄准的目标是实际上将内存转储核心放入流中,而不是从中恢复,显然如果软件正朝着崩溃前进,您应该让它崩溃。 – Illasera 2014-08-29 13:57:16

+1

@Illasera默认情况下,这些信号会导致核心转储,请参见['man signal(7)'](http://man7.org/linux/man-pages/man7/signal.7.html)。您可能需要使用'ulimit -c unlimited'在'.bash_profile'中启用核心转储。有关更多详细信息,请参阅['man core(5)'](http://man7.org/linux/man-pages/man5/core.5.html)。或者使用'setr​​limit(RLIMIT_CORE,...)'和'prctl(PR_SET_DUMPABLE,1,0,0,0)'以编程方式启用核心文件。 – 2014-08-29 14:31:40

+0

如果我在检查一次的时候记得正确,并且现在重新检查它,它不包括堆栈回溯以及在崩溃时使用的文件描述符,也没有其他数据在procfs或其他查询中填充可能希望自行执行现在的问题是,根据您的主要答案,如果在崩溃期间获取此类数据甚至是有效的。 (我之前没有指出它,对此很抱歉)。 – Illasera 2014-08-29 15:12:22