如何解决由故障引起的POSIX信号是同步还是异步生成的?
根据POSIX definitions,
3.28异步生成的信号
与特定线程无关的信号。例如,通过
kill()
发送的信号,从键盘发送的信号以及传递给处理组的信号。异步是信号生成方式的属性,而不是信号编号的属性。 所有信号可能都是异步生成的。
然后
3.379同步生成的信号
属于特定线程的信号。
例如,执行非法指令或触摸无效内存的线程导致同步生成的信号。同步是信号产生方式的一个属性,而不是信号编号的一个属性。
如果非法指令引起同步生成的信号,那么 怎么可能异步生成?
例如,假设我有一个运行两个线程A和B的程序。现在,假设A中发生了一条非法指令,并引发了信号SIGILL
。是否需要POSIX兼容系统才能调用在线程A中为SIGILL
定义的信号处理程序?还是允许中断
线程B并在B中调用该信号处理程序?
相关:
List of Synchronous and Asynchronous Linux/Posix Signals
解决方法
是的,您可以通过kill(2)或通过pthread_kill(3)将SIGILL,SIGSEGV,SIGBUS,SIGFPE等发送到进程。屏蔽仅适用于杀死生成的信号,因此,如果为SIGILL安装处理程序,并对其进行屏蔽,则只会为 real 非法指令陷阱调用处理程序。
,这两种情况是不同的,并且在生成时确定“同步”与“异步”。
再说一遍您的第二个问题,您问:“可以在同一过程中将同步生成的SIGILL归属于特定线程吗?”
不。同步生成的信号只能传递到引起它的线程。 (2.4.1 Signal Generation and Delivery)
现在需要注意的是,如another answer中所述,常规信号屏蔽语义不适用于某些同步生成的信号。特别是,如specs pthread_sigmask
和sigprocmask
所说,” [i] f任何SIGFPE,SIGILL,SIGSEGV或SIGBUS信号在被阻塞时都会产生,结果是未定义,除非信号是[异步]生成的。。 (添加了重点)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。