Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 我怎样才能判断SIGILL是来自非法指令还是来自kill-ILL?_Linux_Unix_Signals_Posix - Fatal编程技术网

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)