欢迎访问宙启技术站
智能推送

[Linux信号]使用sigaction函数注册信号

发布时间:2023-05-16 06:44:25

在Linux系统中,信号(signal)是一种很重要的功能,在操作系统中经常使用。当操作系统触发某些条件时,会向进程发送一个信号。例如:进程可以捕获 Ctrl+C 信号,然后执行一些操作,如程序终止等。

在Linux系统中,使用sigaction函数来注册信号,sigaction函数用于向操作系统指定信号处理程序,当进程接收到信号时,操作系统将执行这些信号处理程序。

sigaction函数的原型如下:

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

其中,signum指定要注册的信号,act指定信号处理程序,oldact用于保存原始的信号处理程序。当处理程序成功注册后,sigaction函数会返回0。

下面是一个样例程序,该程序演示了如何使用sigaction函数来注册信号,当收到信号时,程序会执行自定义的信号处理程序:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void signal_handler(int signo)
{
    printf("Get signal: %d
", signo);
    // 自定义信号处理程序,在收到信号后会执行此函数
}

int main()
{
    struct sigaction act;
    sigemptyset(&act.sa_mask); // 初始化信号集

    act.sa_handler = signal_handler;
    act.sa_flags = SA_RESETHAND; // 信号处理程序执行一次后重新设置为默认值

    if(sigaction(SIGINT,&act,NULL) < 0) {
        printf("install signal error");
        return -1;
    }

    while(1) {
        sleep(1); // 程序主函数无限循环,等待信号
    }

    return 0;
}

在这个程序中,我们使用sigaction函数将SIGINT信号处理程序注册为signal_handler函数。当进程接收到Ctrl+C信号时,会执行signal_handler函数。

我们还可以使用act.sa_flags来指定不同的信号标志,例如SA_RESETHAND,表示信号处理程序执行一次后重新设置为默认值。

该程序是一个非常简单的信号处理程序,但是却可以演示如何在Linux系统中使用sigaction函数来注册信号处理程序。