Linux如何实现信号捕捉

2023-04-12 08:29:00 信号 如何实现 捕捉

Linux如何实现信号捕捉

当一个进程收到一个信号时,它可以选择忽略该信号,或者捕捉该信号并执行相应的处理函数。要捕捉信号,进程必须使用信号函数sigaction()或signal()来注册一个信号处理函数。

一旦进程注册了信号处理函数,当该进程收到信号时就会执行该处理函数。信号处理函数的原型是:

void handler(int signum);

signum参数是捕捉到的信号的编号。处理函数可以根据信号的不同来执行不同的操作。

要注册信号处理函数,可以使用下面两个函数之一:

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

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

sigaction()函数的第一个参数是要注册的信号,第二个参数是一个指向信号处理函数的指针,第三个参数是一个用于存储原来的信号处理函数的指针。signal()函数的第一个参数和sigaction()函数的第一个参数作用相同,第二个参数是一个指向信号处理函数的指针。

下面是一个使用信号处理函数的例子:

#include

#include

#include

void handler(int signum)

{

printf("收到信号 %d\n", signum);

}

int main()

{

//注册信号处理函数

signal(SIGINT, handler);

while(1)

{

printf("正在运行...\n");

sleep(1);

}

return 0;

}

上面的代码定义了一个信号处理函数handler(),该函数只是简单的打印一条消息。在main()函数中,我们使用signal()函数来注册信号处理函数handler(),并设置要捕捉的信号为SIGINT。在循环中,我们只是简单的打印一条消息,每隔一秒钟打印一次。

当运行上面的代码时,按下Ctrl+C键会发送一个SIGINT信号给进程,进程收到该信号后就会执行信号处理函数handler(),打印一条消息,然后继续循环。

信号处理函数的执行是在主程序运行的过程中,因此信号处理函数中不能执行一些耗时的操作,否则会影响主程序的运行。如果信号处理函数中执行了一些耗时操作,可以使用fork()函数创建一个子进程来执行耗时操作,以免影响主进程的运行。

信号处理函数还可以通过调用信号函数signal()来注册其他信号处理函数,从而实现对不同信号的不同处理。

信号处理函数还可以调用一些系统函数来改变进程的运行状态,例如,调用abort()函数可以使进程异常终止,调用exit()函数可以使进程正常终止。

相关文章