QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4378|回复: 0

比较一个shell定时器和一个C定时器的代码

[复制链接]
发表于 2005-3-18 10:34:26 | 显示全部楼层 |阅读模式
shell定时器
[code:1]
#!/bin/sh

#调用函数KillSubProcs,然后返回值14退出.这个返回值用来表示定时器被触发
AlarmHandler() {
    echo "Got SIGALARM,cmd took too long. "
    KillSubProcs
    exit 14

}


#杀死这个脚本的所有子进程,他们的PID存放再变量CHPROCIDS中
KillSubProcs() {
    kill ${CHPROCIDS:-$!}
    if [ $? -eq 0 ] ; then
       echo "Sub-processes   killed. ";
    fi

}


#安装好SIGALAEM的信号处理器后,需要一个函数用来安装定时器.
SetTimer() {
    DEF_TOUT=${1:-10};
    if [ $DEF_TOUT -ne 0 ] ; then


#以下这个命令用sleep来等待一定的时间(存放再$DEF_TOUT中),这段时间过后,kill向脚本发送信号#SIGALAEM(脚本的PID是存放在变量$$中的)
      sleep $DEF_TOUT && kill -s 14 $$ &
       CHPROCIDS="$CHPROCIDS $!"
       TIMEERPROC=$!
    fi
}


#清除SetTimer设置的定时器(SetTimer将定时器的PID保存在变量#TIERPROC中)
UnsetTimer() {
     kill $TIMERPROC

}

#main()

trap ALarmHandler 14

SetTimer 15
$PROG &
CHPROCIDS="$CHPROCIDS $!"
wait $!
UnsetTimer
echo "All Done."
exit 0[/code:1]


C定时器

[code:1]
#include <stdio.h>
#include <unistd.h>
#include <signal.h>

char user[40];

//alarm 捕捉函数
void catch_alarm ( int sig_num)
{
        printf ("Sorry,time limit reached. \n");

//清除定时器
      alarm (0);
         exit (0);
}

int main ( int argc , char *argv[] )
{   
     //设置信号回调
  Signal ( SIGALARM,catch_alarm );
   printf ("Your Username (10 seconds limit):");
//将缓冲内容输出     
   fflush(stdout);  
// 设置10秒钟
   alarm(10);
//等待用户输入
   (char*)get(user);
     printf("your username is = '%' \n'',user);
     return 0;
}
[/code:1]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-3 04:23 , Processed in 0.039727 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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