LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2559|回复: 5

setitimer如何使用

[复制链接]
发表于 2005-12-15 15:21:15 | 显示全部楼层 |阅读模式
HP-UX下

timevalue.it_value.tv_sec=10;
timevalue.it_value.tv_usec=0;
timevalue.it_interval.tv_sec=0;
timevalue.it_interval.tv_usec=0;
setitimer(ITIMER_REAL,&timevalue,&ovalue);

只要设置了 timevalue.it_interval.tv_sec 的值
这个函数就不管用了 到了10秒钟也不终止程序

man了一下
"
A timer value is defined by the itimerval structure.  If it_value is
      non-zero, it indicates the time to the next timer expiration.  If
      it_interval is non-zero, it specifies a value to be used in reloading
      it_value when the timer expires.  Setting it_value to 0 disables a
      timer, regardless of the value of it_interval.  Setting it_interval to
      0 disables a timer after its next expiration (assuming it_value is
      non-zero).
"
不太理解

比如
timevalue.it_value.tv_sec=10;
timevalue.it_value.tv_usec=0;
timevalue.it_interval.tv_sec=10;
timevalue.it_interval.tv_usec=0;
像这样设置了 有什么作用呢 可以做什么
发表于 2005-12-15 18:19:36 | 显示全部楼层
如果你初始话了系统的信号队列并加载了alarm信号的话,setitimer(ITIMER_REAL,&timevalue,&ovalue)在timeval后进程会收到一个系统发送的SIG_ALARM信号,如果你在初始化信号时定义了信号处理函数,就会执行这个处理函数。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-16 09:11:58 | 显示全部楼层
程序中设置了对SIGALRM的捕捉
act.sa_handler = Prt;
        sigemptyset(&act.sa_mask);
        act.sa_flags = 0;
        if(sigaction(SIGALRM,&act,NULL)<0)
                perror("sigaction");

但是只在
timevalue.it_interval.tv_sec=0;
timevalue.it_interval.tv_usec=0;
的时候能收到SIGALRM信号
比如当
timevalue.it_interval.tv_sec=5;
即 它的值大于0的时候 便不起作用了
捕捉不到SIGALRM信号
就是说 setitimer无效了 什么事情也没做
并没有在timevalue.it_value.tv_sec后发出SIGALRM信号
回复 支持 反对

使用道具 举报

发表于 2005-12-16 13:40:22 | 显示全部楼层
你没有设置it_value(当前时间)啊!it_interval - it_value才是延时阿!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-16 15:36:00 | 显示全部楼层
Post by haohao_h
你没有设置it_value(当前时间)啊!it_interval - it_value才是延时阿!


您是说
timevalue.it_value.tv_sec=6;
        timevalue.it_value.tv_usec=0;
        timevalue.it_interval.tv_sec=9;
        timevalue.it_interval.tv_usec=0;
        setitimer(ITIMER_REAL,&timevalue,&ovalue);

这样 延时时间是9-6=3秒
3秒后 会发出SIGALRM信号??
可是没有啊 
或许理解错您的意思了
就上面这几句 大家认为会产生什么效果
回复 支持 反对

使用道具 举报

发表于 2005-12-16 20:56:52 | 显示全部楼层
照你提供的信息有可能有两个原因导致你的失败。
1、你的SIGALRM根本没有加载
2、在系统发出信号时你的进程已经退出了。

如果想让别人更好地帮助你,先看一下版主置顶的《 问题解决之道 之附加条款(仅适用于本版)》
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表