版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pengshengli/article/details/85327959
在Windows环境下使用SetTimer,让系统来调用你的回调函数可以实现,在Linux下查一下,可以用下面的代码实现:
#include<unistd.h>
//设置一个1s延时信号,再注册一个
#include <stdio.h>
#include <signal.h>
#include<iostream>
void timer(int sig)
{
if(SIGALRM == sig)
{
//printf("timer\n");
std::cout<<"timer"<<std::endl;
alarm(3); //重新继续定时1s
}
return ;
}
int main()
{
signal(SIGALRM, timer); //注册安装信号
alarm(3); //触发定时器
while(1)
{
//sleep(1);
//printf("test***\n");
std::cout<<"test***"<<std::endl;
sleep(1);
}
getchar();
return 0;
}
上面的代码有点乱,使用使用信号量SIGALRM + alarm()的方式,参考:LInux下几种定时器的比较和使用
signal(SIGALRM, timer); //注册安装信号
alarm(3); //触发定时器 3秒
然后,为了测试是非阻塞的,写个while循环,一秒输出“test***”
运行结果:
可以看出,是非阻塞的。因为while(1)是死循环了,但每3秒还能打印“timer”.
不管是内核怎么实现的信号量和定时,对于程序员来说,的确使用单线程实现的。
这是一道面试题,可以把以上代码改改,改成打印“hello word”