linux 信号是在内核内部发送或处理的?
Posted
技术标签:
【中文标题】linux 信号是在内核内部发送或处理的?【英文标题】:Where linux signals are sent or processed inside the kernel? 【发布时间】:2011-07-13 13:55:58 【问题描述】:内核中的信号(中断)机制是如何处理的?我问的原因是:不知何故,我的应用程序收到了一个 SIGABRT 信号,我想找到它来自哪里..
【问题讨论】:
【参考方案1】:您应该在您的应用程序中查找原因,而不是在内核中。
通常当进程直接调用abort
或assert
失败时,它会收到SIGABRT
。准确找到传递信号的内核部分将一无所获。
总之,您的代码或您的代码使用的库导致了这种情况。请参阅abort(3)
和assert
。
【讨论】:
【参考方案2】:cnicutar 的回答是恕我直言的最佳猜测。
信号可能已由另一个进程发出,尽管在 SIGBART 的情况下它最有可能由通过abort(3)
libc 函数接收它的同一进程发出。
有疑问,您可以使用strace -e kill yourapp you args ...
运行您的应用程序,以快速检查是否确实从您的程序或依赖库中调用了kill
系统调用。或者使用 gdb catch syscall
。
请注意,在某些情况下,当臭名昭著的“OOM 杀手”开始行动时,内核本身会发出信号,例如 SIGKILL
。
顺便说一句,信号是异步传递的,它们会破坏程序的正常工作流程。这就是为什么他们很难追踪。除了诸如 SystemTap 之类的机器之外,我不知道如何在内核中跟踪或记录信号的发射和传递。
【讨论】:
abort
同步传递其信号。您所需要的只是核心转储或在调试器下运行以准确找到调用它的位置。以上是关于linux 信号是在内核内部发送或处理的?的主要内容,如果未能解决你的问题,请参考以下文章
Linux_进程信号(进程信号生命周期_Core Dump调试_进程信号捕捉_系统调用向进程发送信号_阻塞信号_信号集函数_处理信号内核态与用户态_C语言volatile关键字_SIGCHLD信号)(