linux sigaction函数使用介绍
2024-01-09 14:02:37
在linux中函数 sigaction
用于检查或修改与指定信号相关联的处理动作。这个函数比 signal
函数提供了更多的控制能力,包括对信号处理的细粒度控制。
函数原型如下:
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
参数说明:
signum
:需要捕捉的信号编号,例如SIGINT
、SIGTERM
。act
:指向struct sigaction
结构的指针,该结构指定了对指定信号的新处理动作。如果是NULL
,则不改变当前动作。oldact
:用于保存旧的信号处理动作。如果是NULL
,则不保存。
struct sigaction
结构定义如下:
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
结构成员说明:
sa_handler
:是一个指向信号处理函数的指针。可以设置为SIG_IGN
忽略信号,或SIG_DFL
使用默认动作。sa_sigaction
:是一个替代的信号处理函数,它接收额外的参数。使用时需要设置sa_flags
中的SA_SIGINFO
标志。sa_mask
:是一个信号集,在信号处理函数执行时,这些信号将被添加到进程的信号掩码中,并因此被阻塞。sa_flags
:用于指定信号处理的各种选项,例如SA_RESTART
让被信号中断的系统调用自动重启。sa_restorer
:已废弃,在现代系统中不使用。
以下是使用 sigaction
的示例代码:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void signal_handler(int signum) {
if (signum == SIGINT) {
printf("Received SIGINT signal!\n");
}
}
int main() {
struct sigaction action;
action.sa_handler = signal_handler; // 设置信号处理函数
sigemptyset(&action.sa_mask); // 初始化信号集为空
action.sa_flags = 0; // 通常设置为0
// 设置SIGINT的处理函数为signal_handler
if (sigaction(SIGINT, &action, NULL) < 0) {
perror("sigaction");
return 1;
}
// 通常程序的主循环会在这里
for (;;) {
printf("Waiting for SIGINT...\n");
sleep(1);
}
return 0;
}
在这个示例中,我们定义了一个 signal_handler
函数来处理 SIGINT 信号。然后使用 sigaction
设置这个函数作为 SIGINT 的处理程序。在信号处理程序中,我们检查是否收到 SIGINT 信号,并打印一条消息。
在主循环中,程序会每秒打印一条消息并等待 SIGINT。当你按下 Ctrl+C
时,SIGINT 信号将被生成并由 signal_handler
函数处理。这个程序将继续运行,直到它接收到不同的信号或被显式终止。
文章来源:https://blog.csdn.net/yao_hou/article/details/135142014
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!