C 语言编程 — sigaction 信号处理

目录

文章目录

  • 目录
  • sigaction 信号处理库
  • 示例代码

sigaction 信号处理库

sigaction 信号处理库用于捕获和处理进程接收到的信号(signal)。

sigaction() 函数作用:用于创建一个信号处理实体。

函数原型:

  • signum:指示要处理的信号,是一个 signum.h 宏定义。
  • act:设置信号处理程序的信息。
  • oldact:保存信号处理程序的信息,如果不关心可以为 NULL。
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

结构体 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 字段指定一个 Handler 函数的入口地址。或者是特定的常量值,如果 sa_handler 指定为 SIG_IGN(忽略信号)或 SIG_DFL(采用默认操作),则 sa_sigaction 和 sa_restorer 字段将被忽略。

  • sa_sigaction 字段指定了一个高级信号处理函数,可以获取有关信号的更多信息,如:信号来源,信号的时间戳等。

  • sa_mask 字段用于设置信号掩码。当 handler 运行时,该掩码用于阻止其他信号的干扰。如果不希望阻止任何信号,则可以将掩码设置为全集 sigfillset(&sa.sa_mask);

  • sa_flags 字段是附加标志,可以用于控制 handler 的行为。例如:SA_RESTART 标志可以指定系统调用被信号中断后自动重启,从而避免了系统调用被中断而导致的错误。

  • sa_restorer 字段是一个指向恢复函数的指针。恢复函数用于在 handler 完成后将控制返回给原始程序。在大多数情况下,此字段不需要设置。

示例代码

#include 
#include 
#include 

void signal_handler(int signum) {
    printf("Received signal %d\n", signum);
}

int main() {
    struct sigaction sa;
    sa.sa_handler = signal_handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;

    if (sigaction(SIGINT, &sa, NULL) == -1) {
        perror("sigaction");
        return 1;
    }

    printf("Sending SIGINT...\n");
    kill(getpid(), SIGINT);

    return 0;
}

你可能感兴趣的:(c语言,信号处理,c++)