LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: frank222

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

[复制链接]
 楼主| 发表于 2006-12-29 14:53:50 | 显示全部楼层
谢谢rickxbox的热心帮助,我是新手,尝试了一下你的代码,
void sig_alrm(int){
  if(fork()){
    int status;
    wait(&status);
  }else{
    printf("somthing A\n");
  }
}
main(){
  signal (SIGALRM, sig_alrm);
  while(1){
    alarm(5);
    printf("something B\n");
    pause();                          //
  }
}
虽然看起来程序是可以循环的,但是pause()捕捉到信号后会使程序终止的;如果没有pause(),又不能捕捉信号,进入不了信号处理程序。
不知我的理解可对, 请多指教~~~
回复 支持 反对

使用道具 举报

发表于 2006-12-30 22:32:50 | 显示全部楼层
我总是感觉你的程序怪怪的,如果是我,我会这样写:

main(){
signal(SIGALRM,sig_alrm);
while(1){
printf("something B\n");
alarm(5);
pause();
}
}

void sig_alrm(){
signal (SIGALRM, sig_alrm);
以下随便你写。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-12-31 02:34:33 | 显示全部楼层
l楼上说的,同样不可能实现循环阿,pause()接受到信号就终止了阿
回复 支持 反对

使用道具 举报

发表于 2006-12-31 09:37:04 | 显示全部楼层
哦,不好意思,我昨天赶着走人,所以没有试试就发贴了。
现在有时间试试,不过我重新看了一下楼顶,如下语句有些模棱两可
“不管A完成了否,都切换到B,完成B后,A再执行5s,如此循环”
由A切换到B可以用信号中断,但在执行B时,是否计时器还要计时?
还是像你说的,在完成B后,再重新对A计时5秒,后再次切换到B?
回复 支持 反对

使用道具 举报

发表于 2006-12-31 10:18:08 | 显示全部楼层
这是根据楼主的意思编写的,编译通过,附上运行结果:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

void sig_alrm()
{
        signal(SIGALRM, sig_alrm);
        printf("This is Program B.\n");
        alarm(5);
}

int main()
{
        signal(SIGALRM, sig_alrm);
        alarm(5);

        while(1){
                printf("This is Program A.\n");
                sleep(1);
        }
       
        return 0;       
}

运行结果:
This is Program A.
This is Program A.
This is Program A.
This is Program A.
This is Program A.
This is Program B.
This is Program A.
This is Program A.
This is Program A.
This is Program A.
This is Program A.
This is Program B.
This is Program A.
This is Program A.
This is Program A.
This is Program A.
This is Program A.
This is Program B.
……
……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-2 16:21:49 | 显示全部楼层
多谢hoho_zhao  程序没问题,但是还有些没看懂,main()中超时后,产生SIGALRM信号,进入sig_alrm()处理函数,你又设置了一个定时器,超时后应该继续在sig_alrm()中运行,但实际会回到main中,何解 ?
谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-2 16:24:08 | 显示全部楼层
多谢hoho_zhao  程序没问题,但是还有些没看懂,main()中超时后,产生SIGALRM信号,进入sig_alrm()处理函数,你又设置了一个定时器,超时后应该继续在sig_alrm()中运行,但实际会回到main中,何解 ?
谢谢
回复 支持 反对

使用道具 举报

发表于 2007-1-2 17:11:49 | 显示全部楼层
我只是sig_alrm()中重新设置定时器而已,设置完了,程序就就结束了么?
sig_alrm()结束后,自然返回被打断的while(1)无限循环中。。。。
下一次的ALRM信号的到来是以我在sig_alrm()中设置的时候开始计时
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-2 17:16:43 | 显示全部楼层
噢 谢谢
确实,sig_alrm()中的定时器把main中的定时器取消了 多谢
回复 支持 反对

使用道具 举报

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

本版积分规则

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