SIG_IGN关于SIGFPE,SIGILL,SIGSEGV的未定义行为的规范是否冗余?

时间:2019-06-13 12:11:29

标签: signals posix language-lawyer

POSIX.1-2017在XSH 2.4.3 SIG_IGN下指定

  

忽略了不是由kill(),sigqueue()或raise()生成的SIGFPE,SIGILL,SIGSEGV或SIGBUS信号后,进程的行为是不确定的。 >

我想知道强调部分的意义是什么?

您可以忽略仅由上述函数生成的那些信号,而避免调用未定义的行为吗?

2 个答案:

答案 0 :(得分:0)

换句话说,它表示如果信号是由于硬件故障或陷阱的结果由内核生成的,则忽略此类信号具有不确定的行为。

答案 1 :(得分:0)

如果您期望内核生成这些信号,则不应SIG_IGN-对这些信号进行运算。

您可以在sigaction中用SA_SIGINFO.sa_flags捕获它们,并使用SA_SIGINFO,这样便可以在处理程序中使用info->si_code来区分内核-已发送和用户发送的变体。 如果然后如果信号不是内核发送的,则在处理程序中什么也不做,如果不是,则退出/中止,那么使用SA_RESTART处理程序,您基本上就获得了SIG_IGN的用户空间仿真,也可以与内核发送的SISGEVSIGILL等一起使用。

如果使用实数SIG_IGN,则必须注意不要引起内核生成这些信号(无无效的内存引用,无无效的指令等)。

我认为POSIX可以让您安全地忽略SIGFPESIGILLSIGSEGVSIGBUS,这仅仅是因为没有充分的理由在所有情况下都坚决禁止忽略这些信号,但我认为该功能的背后没有太大意义。