单线程实现非阻塞1s打印“hello world”

版权声明:本文为博主原创文章,未经博主允许不得转载。 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”

猜你喜欢

转载自blog.csdn.net/pengshengli/article/details/85327959