LinuxSir.cn,穿越时空的Linuxsir!

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

程序的定时运行问题 [已解决]

[复制链接]
发表于 2006-12-25 11:34:40 | 显示全部楼层 |阅读模式
linux下 如果有两事件A、B,如何让A运行5s,不管A完成了否,都切换到B,完成B后,A再执行5s,如此循环,
求达人指点 方法
我之前用alarm()的方法,但是alarm捕捉到信号后就终止了
发表于 2006-12-25 15:12:47 | 显示全部楼层
不知道是否可以用定时器的callback来处理。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-25 18:40:08 | 显示全部楼层

我没查到callback的相关信息

我没查到callback的相关信息,能说清楚点吗,
我的程序是
static void  sig_alrm(int signo)
{
        printf("something1");
        return;
}
int main(void)
{
        int i;
        for(;;)
        {
        signal (SIGALRM, sig_alrm);
        alarm(10);
        execl("/bin/key","/bin/key",NULL);
        pause();       
        }
}

key是按键的应用程序,一直等待按键中段,所以捕捉到alarm信号,key被结束,sig_alrm()里的就没执行了,整个进程终止,求解决方法~~
回复 支持 反对

使用道具 举报

发表于 2006-12-25 22:08:28 | 显示全部楼层
在sig_alarm中return之前,加上 alarm(10);
回复 支持 反对

使用道具 举报

发表于 2006-12-25 22:24:09 | 显示全部楼层
我认为是将signal (SIGALRM, sig_alrm)放在

static void sig_alrm(int signo)
{
signal (SIGALRM, sig_alrm);
printf("something1");
return;
}

把循环里面的signal (SIGALRM, sig_alrm)取消,那样ALARM中断完后,程序不会死掉,并且下次再执行 sig_alrm函数
回复 支持 反对

使用道具 举报

发表于 2006-12-26 11:01:36 | 显示全部楼层
Post by frank222
我没查到callback的相关信息,能说清楚点吗,
我的程序是
static void  sig_alrm(int signo)
{
        printf("something1");
        return;
}
int main(void)
{
        int i;
        for(;;)
        {
        signal (SIGALRM, sig_alrm);
        alarm(10);
        execl("/bin/key","/bin/key",NULL);
        pause();       
        }
}

key是按键的应用程序,一直等待按键中段,所以捕捉到alarm信号,key被结束,sig_alrm()里的就没执行了,整个进程终止,求解决方法~~


execl never returns unless an error occured
回复 支持 反对

使用道具 举报

发表于 2006-12-26 11:04:34 | 显示全部楼层
And all(code and data) is gone  after execl is called, so there's no functions such as sig_alrm,... there
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-27 11:45:54 | 显示全部楼层

楼上说的很对,我运行结果就是 an error occured

楼上说的很对,我运行结果就是 在超时后,产生了an error occured
我确实是想key程序经过一段时间,被挂起,去做另一件事B,完成B,再继续执行key,如此循环
或者key程序经过一段时间,被强制终止,去做另一件事B,完成B,重新执行key,如此循环
(注:key执行后永远都在等待中断,假设B就是干printf("OK");吧)

有没有解决方法呢 急啊
回复 支持 反对

使用道具 举报

发表于 2006-12-27 17:40:25 | 显示全部楼层
key:
  1. void sig_alrm(int){
  2.   if(fork()){
  3.     int status;
  4.     wait(&status);
  5.   }else{
  6.     execl("new job");
  7.   }
  8. }
  9. main(){
  10.   signal (SIGALRM, sig_alrm);
  11.   while(1){
  12.     alarm(5);
  13.     .....
  14.   }
  15. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-12-27 17:58:02 | 显示全部楼层
something wrong there, try to correct them
回复 支持 反对

使用道具 举报

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

本版积分规则

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