POSIX.1-2017在XSH 2.4.3 SIG_IGN下指定
忽略了不是由kill(),sigqueue()或raise()生成的SIGFPE,SIGILL,SIGSEGV或SIGBUS信号后,进程的行为是不确定的。 >
我想知道强调部分的意义是什么?
您可以忽略仅由上述函数生成的那些信号,而避免调用未定义的行为吗?
答案 0 :(得分:0)
换句话说,它表示如果信号是由于硬件故障或陷阱的结果由内核生成的,则忽略此类信号具有不确定的行为。
答案 1 :(得分:0)
如果您期望内核生成这些信号,则不应SIG_IGN
-对这些信号进行运算。
您可以在sigaction
中用SA_SIGINFO
和.sa_flags
捕获它们,并使用SA_SIGINFO
,这样便可以在处理程序中使用info->si_code
来区分内核-已发送和用户发送的变体。
如果然后如果信号不是内核发送的,则在处理程序中什么也不做,如果不是,则退出/中止,那么使用SA_RESTART
处理程序,您基本上就获得了SIG_IGN
的用户空间仿真,也可以与内核发送的SISGEV
,SIGILL
等一起使用。
如果使用实数SIG_IGN
,则必须注意不要引起内核生成这些信号(无无效的内存引用,无无效的指令等)。
我认为POSIX可以让您安全地忽略SIGFPE
,SIGILL
,SIGSEGV
或SIGBUS
,这仅仅是因为没有充分的理由在所有情况下都坚决禁止忽略这些信号,但我认为该功能的背后没有太大意义。