Linux定时器实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

很显然,在这个程序中,定时器采用了信号量机制。

相关文档
最新文档