Linux定时器实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux第六次实验及分析报告
实验要求:
1)在用户态编写一个程序,该程序设定一个定时器,在时间到期的时候做出某种可观察的响应(方法不限);
2)分析你的程序的实际执行借助了内核的哪些机制;
3)提交实验与分析报告;
一:在用户态编写一个程序,该程序设定一个定时器,在时间到期的时候做出某种可观察的响应(方法不限);
程序源代码如下:
G++进行编译
运行结果如下:
可见调用间隔定时器定时10秒成功!
二:分析你的程序的实际执行借助了内核的哪些机制;
realtimer_set()函数分析:
void realtimer_set()
{
struct itimerval itv,oldtv;
itv.it__sec=1;
itv.it__usec=0;//定义事件为 1s
itv.it__sec=1;
itv.it__usec=0;//interval=1s
setitimer(ITIMER_REAL,&itv,&oldtv);//调用realtimer
}
这里声明两个为itimerval类型的结构体itv,oldtv,itimerval 在time.h中的定义。其中,it_interval和it_value分别表示时间间隔和当前值,它们又是timeval类型的结构体,继续追踪:
Timeval有两个变量,分别表示秒和微秒,
通过对itv赋值,可以看到,它表示当前时间为1s,间隔为1s。
分析函数setitimer,
执行系统调用do_setitimer,(Itimer.c)
其中,which:间歇计时器类型,有三种选择
ITIMER_REAL //数值为0,计时器的值实时递减,发送的信号是SIGALRM。
ITIMER_VIRTUAL //数值为1,进程执行时递减计时器的值,发送的信号是SIGVTALRM。ITIMER_PROF //数值为2,进程和系统执行时都递减计时器的值,发送的信号是SIGPROF。这里,传递参数为0,发送信号SIGALRAM,
实现了功能:计数初值为:1s,间隔:1s,每隔1s将发送信号SIGALRAM,触发相应的函数。
void sigalrm_handler(int sig)
{
num ++;
}
信号触发的函数,完成的功能为num++,
分析主函数
其中
void (*signal(int signum, void (*handler)(int)))(int);
在使用该调用的进程中加入以下头文件:
#include
上述声明格式比较复杂,如果不清楚如何使用,也可以通过下面这种类型定义的格式来使用(POSIX的定义):
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler)
在调用中,参数signum指出要设置处理方法的信号。第二个参数handler 是一个处理函数,或者是
SIG_IGN:忽略参数signum所指的信号。
SIG_DFL:恢复参数signum所指信号的处理方法为默认值。
传递给信号处理例程的整数参数是信号值,这样可以使得一个信号处理例程处理多个信号。系统调用signal返回值是指定信号signum前一次的处理例程或者错误时返回错误代码SIG_ERR。
很显然,在这个程序中,定时器采用了信号量机制。