#include <stdio.h>
#include <signal.h>
#include <unistd.h>
// 信号处理函数
void sigint_handler(int signum) {
printf("程序已捕获到SIGINT信号\n");
}
int main() {
// 注册SIGINT信号的处理函数
if (signal(SIGINT, sigint_handler) == SIG_ERR) {
perror("signal");
return 1;
}
printf("按Ctrl+C触发SIGINT信号...\n");
while (1) {
sleep(1);
}
return 0;
}
信号处理函数基本结构和关键步骤:
- 定义信号处理函数:
- 函数原型为
void handler(int signum)
,其中signum
是接收到的信号编号。在上述代码中,sigint_handler
函数就是处理SIGINT
信号的函数,它输出自定义提示信息。
- 注册信号处理函数:
- 使用
signal
函数,原型为void (*signal(int signum, void (*handler)(int)))(int)
。第一个参数是要捕获的信号,这里是SIGINT
;第二个参数是信号处理函数的指针,即定义的信号处理函数名。在上述代码中,signal(SIGINT, sigint_handler)
将sigint_handler
函数注册为SIGINT
信号的处理函数。如果注册失败,signal
函数返回SIG_ERR
,需要进行错误处理。
- 等待信号:
- 在主程序中,通常使用一个无限循环(如
while(1)
)让程序持续运行,等待信号的到来。在循环中可以添加其他需要持续执行的代码,这里使用sleep
函数让程序休眠,避免占用过多CPU资源。