sigwaitinfo函数返回具有偏移量的si_addr,这导致分段错误

时间:2019-06-01 12:40:30

标签: c linux multithreading linux-kernel signals

我正在处理信号处理程序,以处理收割的信号,当我调用sigwaitinfo函数时,我会随机获得偏移量的信号。除info.si_addr之外,所有信号属性都是正确的。 info.si_addr中的这些偏移量导致细分错误

这些偏移量似乎是相同的,我已经尝试了删除偏移量,并且可行,但是我需要正确的解决方案才能继续

1 个答案:

答案 0 :(得分:1)

您滥用si_addr。仅适用于有限数量的信号,而这些信号不包含任何实时信号。

Per POSIXsi_addr不适用于SIGILLSIGFPESIGSEGVSIGBUS以外的信号。 Linux还为si_addr提供了SIGTRAP数据:

  

SIGILLSIGFPESIGSEGVSIGBUSSIGTRAP用故障地址填写si_addr

没有其他信号提供si_addr的值。

填写si_addr

The source code linux/kernel/signal.c清楚地表明,si_addr除列出的信号外不用于其他任何信号。

请注意,每个the Linux signal(7) man page

  

实时信号的特征如下:

     
      
  1. 可以将多个实时信号实例排队。通过          相反,如果标准信号的多个实例是          在该信号当前被阻止的情况下传送,则只有一个          实例已排队。

  2.   
  3. 如果使用sigqueue(3)发送信号,则附带一个值          (整数或指针)可以与信号一起发送。如果          接收过程使用以下命令为此信号建立处理程序          sigaction(2)SA_SIGINFO标志,则它可以获得此数据          通过si_value结构的siginfo_t字段作为          处理程序的第二个参数。此外,si_pid和          此结构的si_uid字段可用于获取PID和          发送信号的进程的真实用户ID。

  4.   
     

...