当前位置:  技术问答>linux和unix

请教,setitimer的简单测试程序

    来源: 互联网  发布时间:2016-07-21

    本文导语:  用setitimer设定定时器,代码如下: #include  #include  #include  #include  void timerFunc(int sig); bool setTimer(); int main() {         signal(SIGALRM, timerFunc);         if(setTimer())         {                 printf...

用setitimer设定定时器,代码如下:


#include 
#include 
#include 
#include 

void timerFunc(int sig);
bool setTimer();

int main()
{
        signal(SIGALRM, timerFunc);
        if(setTimer())
        {
                printf("set timer failedn");
                return 1;
        }
        else
        {
                printf("wait timern");
                while(1)
                {
                        pause();
                }
        }

        return 0;
}

bool setTimer()
{
        struct itimerval myTimer;
        myTimer.it_value.tv_sec = 3; //3秒后开始计时
        myTimer.it_interval.tv_sec = 5; //之后每隔五秒响应一次

        return setitimer(ITIMER_REAL, &myTimer, NULL);
}

void timerFunc(int sig)
{
        static int cnt = 5;
        printf("timer func: %in", cnt--);
        fflush(stdout);

        if(cnt == 0)
        {
                printf("timer func finishedn");
        }
}


程序运行后,
输出一行wait timer,就停在那里了。

请问,该如何正常执行timerFunc,以及正常退出程序。
谢谢!!

|
我这里的结果是set timer failed。
我一看,setitimer把errno设成了EINVAL。加上两行之后就好了
        myTimer.it_value.tv_usec = 0;
       myTimer.it_interval.tv_usec = 0;
局部变量如果不初始化,就是不确定值。看来楼主的RP比我好 :)

然后我又加了一行
        if(cnt == 0)
        {
                printf("timer func finishedn");
                exit(0);  // 有点简单粗暴了,呵呵
        }
就得到了楼主想要的结果:
$ ./a.out
wait timer
timer func: 5
timer func: 4
timer func: 3
timer func: 2
timer func: 1
timer func finished


楼主的结果,“输出一行wait timer,就停在那里了”
想不出来是什么原因

|
稍微温和一点的办法,把main里面的while(1)改成while(某个全局变量),然后在timerFunc里面修改这个全局变量


|
就是, 忘记说了, 楼主忘记初始化usec了,  楼上有理, 可以把while(1) 改成某个全局变量来试试, 建议while 条件的变量上加 volatile 修饰, signal处理函数里对while条件进行处理。 完毕。

|



定时器是系统提供的功能, 由系统内部实现或者对系统的功能进行包装实现的。

程序可以不用阻塞在while里的pasue, 但是程序必须没有推出才能接受到定时器的信号, 所以必须保证程序没有推出就可以, 如果只是需要实现超时5次后推出, 可以使用全局变量来做while的条件来实现。

|
代码如下:

#include 
#include 
#include 
#include 
#include 

typedef int bool;

void timerFunc(int sig);
bool setTimer();

volatile bool IsFinishedB = 0;

int main()
{
        signal(SIGALRM, timerFunc);
        if(setTimer())
        {
                printf("set timer failedn");
                return 1;
        }
        else
        {
                printf("wait timern");
                while(IsFinishedB != 1)
                {
                        pause();
                }
        }
        printf("exit.n");

        return 0;
}

bool setTimer()
{
        struct itimerval myTimer;
        memset(&myTimer, 0, sizeof(myTimer));
        myTimer.it_value.tv_sec = 3; //3绉掑悗寮€濮嬭鏃?
        myTimer.it_interval.tv_sec = 5; //涔嬪悗姣忛殧浜旂鍝嶅簲涓€娆?

        return setitimer(ITIMER_REAL, &myTimer, NULL);
}

void timerFunc(int sig)
{
        static int cnt = 5;
        printf("timer func: %in", cnt--);
        fflush(stdout);

        if(cnt == 0)
        {
                printf("timer func finishedn");
                IsFinishedB = 1;
        }
}



    
 
 

您可能感兴趣的文章:

  • 请教:在solaris下测试C++程序是否存在内存泄漏等问题用什么测试工具?
  • 请教一个关于驱动测试程序的问题
  • 向linux达人请教linux下5.1声道测试工具
  • 请教:关于两台计算机通信的测试
  • 请教:JSP最简单的测试环境如何配置!
  • 请教:如何测试Memory的address line
  • 90分请教!为什么我写的JSP在本地测试正常,上传以后就不能用(提示资源不允许)
  • 请教LINUX下串口测试程序!
  • 请教:在IBM VisualAge For Java 的 WebSphere测试环境中启动 EJB ...
  • 请教:写好了某个application并测试通过以后,接下来应该如何做?
  • sun测试题———选什么,为什么这么选?谢谢(java初学者请教)
  • 请教一下究竟是什么原因导致在服务状态daemon下无法调用外界脚本呢?(附测试代码)
  • 如何用JSP测试EJB,请教教我!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 请教这种循环的执行过程
  • 请教两个redhat9问题
  • 请教如何在指定目录下查找包含指定文字的文件
  • 请教局域网中如何通过ip地址得到主机名
  • 请教kdevelop的问题
  • 请教linux 下的adsl拨号问题.
  • 请教,如何用虚拟订机安装liux
  • 【请教】LINUX 下SNMP的MIB开发
  • 请教一个opengl的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3