在内核中发送或处理linux信号的地方?

时间:2011-07-13 13:55:59

标签: linux kernel signals abort

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

2 个答案:

答案 0 :(得分:6)

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

通常,当流程直接调用SIGABRTabort失败时,流程会收到assert。准确地找到传递信号的内核部分将不会为您带来任何好处。

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

答案 1 :(得分:1)

cnicutar的答案是最好的猜测恕我直言。

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

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

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

顺便说一句,信号以异步方式传送,它们会破坏程序的正常工作流程。这就是他们追踪痛苦的原因。除了像SystemTap这样的机器,我不知道如何跟踪或记录内核中的信号发射和传输。