struct sigaction写一个初始化示例代码
时间: 2023-11-02 21:23:07 浏览: 69
好的,以下是一个使用大括号和初始值列表初始化 `struct sigaction` 的示例代码:
```
#include <stdio.h>
#include <signal.h>
void my_handler(int signum) {
printf("Received signal %d\n", signum);
}
int main() {
struct sigaction sa = {
.sa_handler = my_handler,
.sa_flags = SA_RESTART
};
sigemptyset(&sa.sa_mask); // 初始化 sa_mask
if (sigaction(SIGINT, &sa, NULL) == -1) {
perror("sigaction");
return 1;
}
printf("Waiting for signal...\n");
while (1) {}
return 0;
}
```
该示例使用 `sigaction` 函数将 `my_handler` 函数注册为 `SIGINT` 信号的处理函数,并且使用 `SA_RESTART` 标志指示在处理信号时应该自动重启被中断的系统调用。同时,通过调用 `sigemptyset` 来初始化 `sa_mask`,这意味着在处理 `SIGINT` 信号时将阻塞任何其他信号。
相关问题
c代码中,为一个信号量指定回调函数,那么对于 struct sigaction sigact; 回调函数是赋值给sigact.sa_handler,还是赋值给 sigact.sa_sigaction?
在C语言中,如果你想要为一个信号(SIG)设置一个自定义的回调函数(handler),你应该将其赋值给`struct sigaction`结构体的`sa_sigaction`成员,而不是`sa_handler`。`sa_handler`用于存储传统的函数指针,它适用于简单的一对一映射。然而,`sa_sigaction`允许你提供一个更复杂的处理程序结构,其中包含了用户级上下文和一个指向真正执行代码的函数指针,这对于需要额外信息或复杂处理流程的信号是非常有用的。
以下是设置信号处理器的示例:
```c
struct sigaction new_action;
memset(&new_action, 0, sizeof(new_action)); // 初始化结构
// 使用sa_sigaction,这里假设custom_handler是你要注册的回调函数
new_action.sa_sigaction = custom_handler;
new_action.sa_flags = SA_SIGACTION;
// 调用sigaction函数传递信号号和新的动作
if (sigaction(SIGINT, &new_action, NULL) == -1) {
perror("Failed to set signal handler");
}
```
C语言产生SIGBUS的示例代码
在C语言中,SIGBUS通常表示内存访问错误,比如无效地址引用。以下是一个简单的示例,通过指针操作非法内存来模拟产生SIGBUS信号:
```c
#include <stdio.h>
#include <signal.h>
void handler(int signum) {
printf("Received SIGBUS signal.\n");
exit(EXIT_FAILURE); // 程序退出
}
int main(void) {
/* 声明并初始化一个非法的指针 */
void* invalid_ptr = NULL;
/* 注册SIGBUS信号处理器 */
struct sigaction sa;
sa.sa_handler = handler;
sigfillset(&sa.sa_mask); // 设置信号屏蔽集,接收所有信号
sa.sa_flags = SA_RESTART; // 设置重启选项以便于测试
if (sigaction(SIGBUS, &sa, NULL) == -1) {
perror("Failed to register signal handler");
return 1;
}
// 指向无效内存地址可能会触发SIGBUS
*invalid_ptr = 10; // 这将导致一个未定义的行为,通常是SIGBUS
return 0;
}
```
当执行这段代码时,如果尝试写入`invalid_ptr`所指向的内存位置,程序会捕获到SIGBUS信号并调用`handler`函数。请注意,在实际应用中,这种行为是不安全的,应该避免。
阅读全文