面试题答案
一键面试实现代码
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>
// 信号处理函数
void print_time(int signum) {
time_t now;
struct tm *tm_info;
time(&now);
tm_info = localtime(&now);
char time_str[26];
strftime(time_str, 26, "%Y-%m-%d %H:%M:%S", tm_info);
printf("Current time: %s\n", time_str);
}
int main() {
// 设置信号处理函数
if (signal(SIGALRM, print_time) == SIG_ERR) {
perror("signal");
return 1;
}
// 设置定时器,每1秒触发一次SIGALRM信号
alarm(1);
// 进入无限循环,防止程序退出
while (1) {
pause();
}
return 0;
}
定时器函数原理
这里使用alarm
函数来实现定时器功能。alarm
函数的作用是设置一个定时器(闹钟),当经过指定的秒数后,内核会向进程发送SIGALRM
信号。
函数原型为:unsigned int alarm(unsigned int seconds);
seconds
参数指定了定时器触发的时间(以秒为单位)。- 返回值是之前设置的闹钟剩余的秒数,如果之前没有设置闹钟,则返回0。
实现思路
- 定义信号处理函数:编写一个信号处理函数
print_time
,当接收到SIGALRM
信号时,获取当前系统时间并打印。 - 设置信号处理函数:在
main
函数中,使用signal
函数将SIGALRM
信号与print_time
函数关联起来。 - 启动定时器:使用
alarm
函数设置定时器,让其每隔1秒触发一次SIGALRM
信号。 - 防止程序退出:进入一个无限循环
while(1)
,并使用pause
函数使进程暂停,等待信号的到来。当SIGALRM
信号到达时,会调用print_time
函数,之后进程继续在pause
处等待下一个信号。