[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函数来注册信号处理程序。
