首页 > 解决方案 > 未设置 SA_SIGINFO 时使用带有 sigaction 的 sigaction 处理程序

问题描述

规范说_

如果在 sa_flags 中指定了 SA_SIGINFO,则 sa_sigaction(而不是 sa_handler)指定 signum 的信号处理函数。

但是,以下代码可以神奇地工作

#include <stdio.h>
#include <signal.h>

static void handler(int signo, siginfo_t *si, void *uc){
   printf("si = %d\n", *(char*)si);
   printf("uc = %d\n", *(char*)uc);
}

int main(void)
{
      struct sigaction psa;
      psa.sa_flags = 0;
      psa.sa_sigaction = handler;
      sigaction(SIGTSTP, &psa, NULL);
      for(;;) {}
      return 0;
}

handler 能够访问 si 和 ui 的内存,gdb 显示至少 si 确实是指向 siginfo_t 的指针。但是,该代码将 sa_sigaction 和 sa_handler 实现为联合。如果运行时使用 sa_flags 来决定使用 sa_sigaction 还是 sa_handler,似乎很难知道应该使用 sa_sigaction...

这是否意味着运行时总是为这两种调用提供 si 和 uc ?这样的用户代码是否定义明确?

标签: clinuxunixsignals

解决方案


这是否意味着运行时总是为这两种调用提供 si 和 uc ?

这意味着特定的实现确实如此,是的。

这样的用户代码是否定义明确?

不,这意味着它依赖于恰好在一个特定平台上工作的未定义行为。

请注意,即使在您当前的平台上,此快捷方式也可能不适合您。您可以原谅您的运行时本身在siginfo_tanducontext_t参数中使用垃圾的捷径。毕竟,通过不省略 SA_SIGINFO,您告诉实现您不需要该信息。


推荐阅读