怎么设置时钟

lovepeacer 2004-03-31 05:52:00
类似vc中的settimer()
...全文
60 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
vctony 2004-03-31
  • 打赏
  • 举报
回复
int getitimer(int which, struct itimerval *value);
int setitimer(int which,conststruct itimerval *value, struct itimerval *ovalue);



  下面我们具体学习一下各个参数的含义。

  系统给每个进程提供了3个定时器,每个定时器在各自不同的域里面计数。当任何一个timer计数到结束了,系统就发送一个信号(signal)给该进程,同时计数器重置。

  一共支持以下3中计数器形式:

  ITIMER_REAL 在real time中计数器减1,然后等计数往比后发送SIGALRM信号。

  ITIMER_VIRTUAL 当进程在执行的过程中计数,然后当计数完毕后发送SIGVTALRM信号给该进程。

  ITIMER_PROF 在该进程被执行和系统在代表该进程执行的时间都进行计数。与ITIMERVIRTUAL比较,这个计时器可以同时记录该进程在用户态和内核态执行过程中消耗的时间。当计数完毕后,SIGPROF信号将发送给进程。

  Timer的值采用如下的结构体:


struct itimerval {
struct timeval it_interval; /* next value */
struct timeval it_value; /* current value */
};
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};



  gettimer(2)用当前的设置的值填充value这个变量参数指向的结构体,而which参数指明查询的计数器的类型(ITIMER_REAL、 ITIMER_VIRTUAL 和 ITIMER_PROF中的一个)。结构体重的成员变量it_value中返回的是当前计数器还剩下的计数值;如果该成员变量返回的值是0,则表示该计时器被禁止了。与之类似,it_interval设置为计数器reset后的初始值。

  Settimer(2)通过输入参数value来设置指定的timer的相关属性。如果ovalue返回后的值非0,则该变量里面存储了timer以前的旧的设置值。

  计数器计数从it_value开始,减1操作,一直减到0;然后产生一个信号给使用该计时器的进程,然后reset计数器为it_interval。如果把timer设置为0,也就是说设置it_value为0或者当计数器计数完毕后,而it_interval为0,这时候计数器就停止工作。

  这里,tv_sec和tv_usec同时可以用来检测timer的的持续时间。

  返回值比较简单,如果成功则返回0,否则返回-1,然后相应的errno被设置为如下预先定义的一些值:

  EFAULT 参数value 和 ovalue 指针不合法。

  EINVAL which 的值不合法,不是ITIMER_REAL、 ITIMER_VIRT或者 ITIMER_PROF 中的一个。

  一些注意事项:

  在Linux环境下,产生和发送一个信号是截然不同的,而且同时只能有一个信号被发送给进程。这就可能存在一个小问题,例如,当系统存在一个非常繁重的作业调度的时候,如果采用ITIMER_REAL这种计时器,可能计数完毕,而前一次计数完毕后发出的信号还没有发送给用户进程,这时候,第二次的信号将被丢弃。

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧