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:需要捕捉的信号编号,例如 SIGINTSIGTERM
  • 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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。