0

内核中如何处理信号(中断)机制?我问的原因是:不知何故,我的应用程序收到了一个 SIGABRT 信号,我想知道它是从哪里来的。

4

2 回答 2

6

您应该在您的应用程序中查找原因,而不是在内核中。

通常一个进程SIGABRT在直接调用abortassert失败时接收。准确地找到传递信号的内核部分不会给你带来任何好处。

总之,您的代码或您的代码正在使用的库导致了这种情况。见abort(3)assert

于 2011-07-13T14:00:17.613 回答
1

cnicutar 的回答是恕我直言的最佳猜测。

abort(3)信号可能是由另一个进程发出的,尽管在 SIGBART 的情况下,它很可能是由通过libc 函数接收它的同一个进程发出的。

有疑问,您可以运行您的应用程序strace -e kill yourapp you args ...以快速检查该kill系统调用是否确实是从您的程序或依赖库中调用的。或使用 gdb catch syscall

请注意,在某些情况下,内核本身可以发出信号,例如SIGKILL当臭名昭著的“OOM 杀手”开始行动时。

顺便说一句,信号是异步传递的,它们会破坏程序的正常工作流程。这就是为什么他们很难追踪。除了诸如 SystemTap 之类的机器之外,我不知道如何在内核中跟踪或记录信号的发射和传递。

于 2011-07-13T21:33:25.260 回答