c - 虽然返回 si_addr 与 sigwaitinfo 函数的偏移量导致分段错误
问题描述
我正在signal handler
处理收割信号,随机我在调用sigwaitinfo
函数时得到带有偏移的信号。所有信号属性都是正确的,除了info.si_addr
. 这个偏移量info.si_addr
导致了分段错误。
这个偏移量似乎是相同的 - 我已经尝试删除偏移量并且有效,但我需要一个正确的解决方案才能继续前进。
static void *signalHandler(void *vptr_args __attribute__((unused)))
{
sigset_t signal_set;
siginfo_t info;
sigemptyset(&signal_set);
sigaddset(&signal_set, SIG_REAP);
sigaddset(&signal_set, SIG_ISOC_CANCEL);
sigaddset(&signal_set, SIGTERM);
sigaddset(&signal_set, SIGPIPE);
while (true) {
int rc = sigwaitinfo(&signal_set, &info);
//...
if (rc > 0)
{
if(info.si_signo == SIG_REAP)
{
// Reap URBs after some simple checks
if ((info.si_code != SI_ASYNCIO) &&
(info.si_code != SI_KERNEL)) {
printf("Bad si_code %d in SIG_REAP", info.si_code);
continue;
}
else {
printf("OK si_code %d in SIG_REAP", info.si_code);
}
struct usbdevfs_urb *ioctl_urb = (struct usbdevfs_urb*)info.si_addres
if (!ioctl_urb) {
printf("SIG_REAP gave NULL ioctl_urb");
continue;
}
UrbInfo *urbInfo = ioctl_urb->usercontext;
if (!urbInfo) {
printf("SIG_REAP gave NULL urbInfo");
continue;
}
解决方案
你在滥用si_addr
. 它仅适用于有限数量的信号,并且不包括任何实时信号。
根据 POSIX,si_addr
不适用于SIGILL
、SIGFPE
、SIGSEGV
和以外的信号SIGBUS
。Linux 还提供si_addr
以下数据SIGTRAP
:
SIGILL
,SIGFPE
,SIGSEGV
,SIGBUS
,SIGTRAP
填写si_addr
故障地址。
没有其他信号为 提供值si_addr
。
linux/kernel/signal.c
填写的源代码si_addr
清楚地表明,si_addr
除了列出的信号外,不用于任何信号。
请注意,根据Linuxsignal(7)
手册页:
实时信号的区别如下:
实时信号的多个实例可以排队。相反,如果一个标准信号的多个实例被传递而该信号当前被阻塞,那么只有一个实例被排队。
如果使用 发送信号
sigqueue(3)
,则可以随信号发送一个伴随值(整数或指针)。SA_SIGINFO
如果接收进程使用to 标志为这个信号建立一个处理程序,那么它可以通过作为第二个参数传递给处理程序的结构的字段sigaction(2)
获取这个数据。此外,该结构体的and 字段可用于获取发送信号的进程的 PID 和真实用户 ID。si_value
siginfo_t
si_pid
si_uid
...
推荐阅读
- wordpress - 从 Joomla 导出许多产品并导入到 WordPress
- javascript - 按多个属性对对象数组进行分组
- python - 将元组转换为 int - python
- php - Woocommerce 订阅:获取订阅产品的天数
- php - 如何仅为带有子项的菜单项添加下拉切换类?
- cookies - SF 4.1 - 未定义的类常量“SAMESITE_NONE”
- encryption - RSA SubtleCrypto 解密期间的 DOMException
- javascript - 使用 Redux Provider 后出现 Store 错误
- sapui5 - 将 SimplePlanningCalendar 添加到 UI5 应用程序失败并出现“getKey”错误
- postgresql - Symfony 4:PostgreSQL:SCRAM 身份验证问题?