|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果你只是想应付一下操作系统的课程,劝你最好别学,或者说不要指望能用的怎么样。
在Linux完成一个准时器,不像Win32下那样直不雅。在Win32挪用SetTimer就好了,在Linux下则没有响应函数能够间接挪用。准时器作为一个经常使用的功效,在Linux固然也有响应完成。上面我们看看几种经常使用的办法。
要完成准时器功效,最土的举措完成莫过于用sleep/usleep来完成了。固然,它会堵塞以后线程,除处置准时功效外,甚么活也干不了。固然要办理这个成绩不难,创立一个独自的线程来卖力准时器,别的线程卖力一般的义务就好了。
要完成准时器功效,最复杂的举措就是ALarm旌旗灯号。这类办法复杂,也响应的缺点:用旌旗灯号完成效力较低;最小精度为1秒,没法完成高精度的界说器。复杂示例:
#include<stdio.h>
#include<signal.h>
staticvoidtimer(intsig){
if(sig==SIGALRM){
printf("timer
");
}
return;
}
intmain(intargc,char*argv[]){
signal(SIGALRM,timer);
alarm(1);
getchar();
return0;
}
(setitimer和alarm有相似的功效,也是经由过程旌旗灯号来完成)
最文雅的办法是利用RTC机制。使用select函数,你能够用单线程完成准时器,同时还能够处置别的义务。复杂示例:
#include<stdio.h>
#include<linux/rtc.h>
#include<sys/ioctl.h>
#include<sys/time.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
intmain(intargc,char*argv[]){
unsignedlongi=0;
unsignedlongdata=0;
intretval=0;
intfd=open("/dev/rtc",O_RDONLY);
if(fd<0){
perror("open");
exit(errno);
}
/*Setthefreqas4Hz*/
if(ioctl(fd,RTC_IRQP_SET,4)<0){
perror("ioctl(RTC_IRQP_SET)");
close(fd);
exit(errno);
}
/*Setthefreqas4Hz*/
if(ioctl(fd,RTC_IRQP_SET,4)<0){
perror("ioctl(RTC_IRQP_SET)");
close(fd);
exit(errno);
}
/*Enableperiodicinterrupts*/
if(ioctl(fd,RTC_PIE_ON,0)<0){
perror("ioctl(RTC_PIE_ON)");
close(fd);
exit(errno);
}
for(i=0;i<100;i++){
if(read(fd,&data,sizeof(unsignedlong))<0){
perror("read");
close(fd);
exit(errno);
}
printf("timer
");
}
/*Disableperiodicinterrupts*/
ioctl(fd,RTC_PIE_OFF,0);
close(fd);
return0;
}
</p>
当你经过一段时间的学习后就应该扩充自己的知识,多学习linux命令,但是不要在初学阶段就系统的学习linux命令。 |
|