c - 未设置 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 ?这样的用户代码是否定义明确?
解决方案
这是否意味着运行时总是为这两种调用提供 si 和 uc ?
这意味着特定的实现确实如此,是的。
这样的用户代码是否定义明确?
不,这意味着它依赖于恰好在一个特定平台上工作的未定义行为。
请注意,即使在您当前的平台上,此快捷方式也可能不适合您。您可以原谅您的运行时本身在siginfo_t
anducontext_t
参数中使用垃圾的捷径。毕竟,通过不省略 SA_SIGINFO,您告诉实现您不需要该信息。
推荐阅读
- azure - 如何将 Easy Auth 与 .NET Core 3.1 MVC App 集成?
- reactjs - 反应表单输入字段不会让我改变值
- npm - 如何在 jsontohtml node-js (npm) 模块中为按钮添加点击事件
- python - Gremlin Python - “服务器已断开 - 请尝试重新连接”错误
- sql - 如何使用 SQL 查询删除具有固定日期但可变时间的某些行?
- python - 使用 Python 解析时处理文件格式更改的最佳方法?
- wordpress - 将 LinkedIn 帖子嵌入 Wordpress 博客
- rust - 如何将泛型函数转换为带有引用参数的函数指针?
- fetch - Mirage Passthrough 返回响应对象而不是从网络调用返回的 JSON 数据
- c# - 从 RethinkDb 读取二进制文件