快捷搜索:   服务器  安全  linux 安全  MYSQL  dedecms

Linux系统进程间隔定时器Itimer(2)

  * and all newer ports shouldn't need it.

  */

  asmlinkage unsigned long sys_alarm(unsigned int seconds)

  {

  struct itimerval it_new, it_old;

  unsigned int oldalarm;

  it_new.it_interval.tv_sec = it_new.it_interval.tv_usec = 0;

  it_new.it_value.tv_sec = seconds;

  it_new.it_value.tv_usec = 0;

  do_setitimer(ITIMER_REAL, &it_new, &it_old);

  oldalarm = it_old.it_value.tv_sec;

  /* ehhh.. We can't return 0 if we have an alarm pending.. */

  /* And we'd better return too much than too little anyway */

  if (it_old.it_value.tv_usec)

  oldalarm++;

  return oldalarm;

  }

  这个系统调用实际上就是启动进程的ITIMER_REAL间隔定时器。因此它完全可放到用户空间的C函数库(比如libc和glibc)中来实现。但是为了保此内核的向后兼容性,2.4.0版的内核仍然将这个syscall放在内核空间中来实现。函数sys_alarm()的实现过程如下:

  (1)根据参数seconds的值构造一个itimerval结构变量it_new。注意!由于alarm启动的ITIMER_REAL间隔定时器是一次性而不是循环重复的,因此it_new变量中的it_interval成员一定要设置为0。

  (2)调用函数do_setitimer()函数以新构造的定时器it_new来启动当前进程的ITIMER_REAL定时器,同时将该间隔定时器的原定时间隔保存到局部变量it_old中。

  (3)返回值oldalarm表示以秒数计的ITIMER_REAL间隔定时器的原定时间隔值。因此先把it_old.it_value.tv_sec 赋给oldalarm,并且在it_old.it_value.tv_usec非0的情况下,将oldalarm的值加1(也即不足1秒补足1秒)。

  原文地址 http://tech.ddvip.com/2007-03/117353696820628.html

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论