面试题答案
一键面试信号基本概念
信号是在软件层次上对中断机制的一种模拟,是一种异步通知机制。进程在运行过程中,可能会收到各种信号,这些信号通知进程发生了某种特定事件。例如,用户按下Ctrl+C会产生SIGINT信号,通知前台进程终止运行。信号可以由内核、其他进程或者进程自身产生,进程接收到信号后,会根据其当前的信号处理方式进行响应,处理方式一般有三种:忽略该信号、采用默认处理动作、自定义处理函数。
使用signal
函数捕获并处理SIGINT信号
signal
函数用于设置一个信号的处理方式,其原型为:
#include <signal.h>
void (*signal(int signum, void (*handler)(int)))(int);
signum
:指定要处理的信号编号,例如SIGINT。handler
:处理函数的指针,或者是SIG_IGN
(忽略信号),或者是SIG_DFL
(采用默认处理动作)。
示例代码
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
// 信号处理函数
void sigint_handler(int signum) {
printf("Received SIGINT signal. Exiting gracefully...\n");
// 在此处添加清理或其他处理逻辑
_exit(0);
}
int main() {
// 设置SIGINT信号的处理函数
if (signal(SIGINT, sigint_handler) == SIG_ERR) {
perror("signal");
return 1;
}
printf("Running... Press Ctrl+C to exit.\n");
while (1) {
sleep(1);
}
return 0;
}
在上述代码中:
- 定义了
sigint_handler
函数,当接收到SIGINT信号时,该函数会被调用,打印一条提示信息并退出程序。 - 在
main
函数中,使用signal
函数将SIGINT信号的处理函数设置为sigint_handler
。如果设置失败,signal
函数会返回SIG_ERR
并设置errno
。 - 主程序进入一个无限循环,每秒休眠一次,等待信号的到来。当用户按下Ctrl+C时,会触发SIGINT信号,调用
sigint_handler
函数进行处理。