比较一个shell定时器和一个C定时器的代码
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]