Linux 我怎样才能判断SIGILL是来自非法指令还是来自kill-ILL?
在通过Linux 我怎样才能判断SIGILL是来自非法指令还是来自kill-ILL?,linux,unix,signals,posix,Linux,Unix,Signals,Posix,在通过void(*sa_sigaction)(int,siginfo_t*,void*)安装的信号处理器中,如何判断SIGILL是来自非法指令还是来自发送SIGILL的某个进程?我查看了siginfou t的si_pid,但这似乎是在遇到非法指令时未初始化的,因此我无法根据它做出决定。-当然,我正在寻找一个更简单和可移植的解决方案,而不是阅读si_addr上的指令代码并试图确定它是否合法。一个真正的SIGILL将拥有一个包含一个ILL_值(例如,ILL_ILLADR)的si_code。用户请求的
void(*sa_sigaction)(int,siginfo_t*,void*)安装的信号处理器中代码>,如何判断SIGILL是来自非法指令还是来自发送SIGILL的某个进程?我查看了siginfou t的si_pid
,但这似乎是在遇到非法指令时未初始化的,因此我无法根据它做出决定。-当然,我正在寻找一个更简单和可移植的解决方案,而不是阅读si_addr
上的指令代码并试图确定它是否合法。一个真正的SIGILL将拥有一个包含一个ILL_值(例如,ILL_ILLADR)的si_code
。用户请求的SIGILL将具有一个si值的si_code
(通常是si_用户)
这些措施包括:
例如,kill(1)
和kill(2)
给我零(用户)
当然,您的实现可能会向POSIX列表中添加值。历史上,用户或进程生成的si_code
值为si_code si_code>0)
您为什么要这样做?。。。为了找到Xenomai线程终止的原因,gdb说“程序以信号4终止,非法指令”。但在$pc的核心文件中有一条合法的分支指令。实际上,kill
生成的信号的si_code
应该是si_USER
,通常为0,但在某些系统上可能是其他的。它将不同于所有的ILL\uu
值。@不,是的,但OP的测试表明他不能仅依赖该字段。谢谢,你当然是对的。我被手册的措词弄糊涂了,以下值可以放在SIGILL信号的si_代码中。
[Kernel-generated]
ILL_ILLOPC Illegal opcode.
ILL_ILLOPN Illegal operand.
ILL_ILLADR Illegal addressing mode.
ILL_ILLTRP Illegal trap.
ILL_PRVOPC Privileged opcode.
ILL_PRVREG Privileged register.
ILL_COPROC Coprocessor error.
ILL_BADSTK Internal stack error.
[User-requested]
SI_USER Signal sent by kill().
SI_QUEUE Signal sent by the sigqueue().
SI_TIMER Signal generated by expiration of a timer set by timer_settime().
SI_ASYNCIO Signal generated by completion of an asynchronous I/O request.
SI_MESGQ Signal generated by arrival of a message on an empty message queue.
#define SI_FROMUSER(siptr) ((siptr)->si_code <= 0)
#define SI_FROMKERNEL(siptr) ((siptr)->si_code > 0)