| ÂÛ̳ע²á| ¼ÓÈëÊÕ²Ø | ÉèΪÊ×Ò³| RSS
Google
Äúµ±Ç°µÄλÖãºÊ×Ò³ > LinuxƵµÀ > Linux¿ª·¢Çø > ÄÚºËÑо¿

¶¨Ê±Æ÷

ʱ¼ä£º2005-12-01 12:54:54  À´Ô´£º  ×÷Õߣº
£·´¹ýÀ´½²£¬Èç¹û¶Ô
tviÖ´Ðйýcascade_timers()º¯Êýºótvi.index²»µÈÓÚ1£¬ÄÇô¿ÉÒԿ϶¨ÔÚδ¶ÔtviÖ´ÐÐcascade_timers()º¯ÊýÖ®
ǰ£¬tvi.indexÖµ¿Ï¶¨²»Îª0£¬Òò´ËÕâʱtvi²»ÐèÒª´Ótv(i+1)Öв¹³ä¶¨Ê±Æ÷£¬Õâʱ¾Í¿ÉÒÔÖÕÖ¹do{}whileÑ­»·¡£
£¨2£©½ÓÏÂÀ´£¬¾ÍÒªÖ´Ðж¨Ê±Æ÷ÏòÁ¿tv1.vec£Ûtv1.index£ÝÖеÄËùÓе½ÆÚ¶¨Ê±Æ÷¡£Òò´ËÕâÀïÓÃÒ»¸ögoto repeatÑ­»·´ÓÍ·µ½Î²ÒÀ
´ÎɨÃèÕû¸ö¶¨Ê±Æ÷¶ÔÁС£ÓÉÓÚÔÚÖ´Ðж¨Ê±Æ÷µÄ¹ØÁªº¯Êýʱ²¢²»ÐèÒª¹ØCPUÖжϣ¬ËùÒÔÔÚÓÃdetach_timer()º¯Êý½«µ±Ç°¶¨Ê±Æ÷´Ó¶ÔÁÐ
ÖÐÕª³ýºó£¬¾Í¿ÉÒÔµ÷ÓÃspin_unlock_irq()º¯Êý½øÐнâËøºÍ¿ªÖжϣ¬È»ºóÔÚÖ´ÐÐÍ굱ǰ¶¨Ê±Æ÷µÄ¹ØÁªº¯ÊýºóÖØÐÂÓÃ
spin_lock_irq£¨£©º¯Êý¼ÓËøºÍ¹ØÖжϡ£
£¨3£©µ±Ö´ÐÐÍ궨ʱÆ÷ÏòÁ¿tv1.vec[tv1.index]ÖеÄËùÓе½ÆÚ¶¨Ê±Æ÷ºó£¬tv1.vec£Ûtv1.index£ÝÓ¦¸ÃÊǸö¿Õ¶ÓÁС£ÖÁ´ËÕâÒ»´Î
¶¨Ê±Æ÷·þÎñÒ²¾ÍÐû¸æ½áÊø¡£
£¨4£©×îºó£¬½«timer_jiffiesÖµ¼Ó1£¬½«tv1.indexÖµ¼Ó1£¬µ±È»ËüµÄÄ£ÊÇ256¡£È»ºó£¬»Øµ½whileÑ­»·¿ªÊ¼ÏÂÒ»´Î¶¨Ê±Æ÷·þÎñ¡£
7£®7 ½ø³Ì¼ä¸ô¶¨Ê±Æ÷itimer
Ëùν¡°¼ä¸ô¶¨Ê±Æ÷£¨Interval Timer£¬¼ò³Æitimer£©¾ÍÊÇÖ¸¶¨Ê±Æ÷²ÉÓá°¼ä¸ô¡±Öµ£¨interval£©À´×÷Ϊ¼ÆÊ±·½Ê½£¬µ±¶¨Ê±Æ÷Æô¶¯
ºó£¬¼ä¸ôÖµinterval½«²»¶Ï¼õС¡£µ±intervalÖµ¼õµ½0ʱ£¬ÎÒÃǾÍ˵¸Ã¼ä¸ô¶¨Ê±Æ÷µ½ÆÚ¡£ÓëÉÏÒ»½ÚËù˵µÄÄں˶¯Ì¬¶¨Ê±Æ÷Ïà±È£¬¶þ
Õß×î´óµÄÇø±ðÔÚÓÚ¶¨Ê±Æ÷µÄ¼ÆÊ±·½Ê½²»Í¬¡£Äں˶¨Ê±Æ÷ÊÇͨ¹ýËüµÄµ½ÆÚʱ¿ÌexpiresÖµÀ´¼ÆÊ±µÄ£¬µ±È«¾Ö±äÁ¿jiffiesÖµ´óÓÚ»òµÈÓÚ
Äں˶¯Ì¬¶¨Ê±Æ÷µÄexpiresֵʱ£¬ÎÒÃÇ˵ÄÚºËÄں˶¨Ê±Æ÷µ½ÆÚ¡£¶ø¼ä¸ô¶¨Ê±Æ÷Ôòʵ¼ÊÉÏÊÇͨ¹ýÒ»¸ö²»¶Ï¼õСµÄ¼ÆÊýÆ÷À´¼ÆÊ±µÄ¡£ËäÈ»
ÕâÁ½ÖÖ¶¨Ê±Æ÷²¢²»Ïàͬ£¬µ«È´Ò²ÊÇÏ໥ÁªÏµµÄ¡£¼ÙÈçÎÒÃÇÿ¸öʱÖÓ½ÚÅĶ¼Ê¹¼ä¸ô¶¨Ê±Æ÷µÄ¼ä¸ô¼ÆÊýÆ÷¼õ1£¬ÄÇôÔÚÕâÖÖÇéÐÎϼä¸ô¶¨
ʱÆ÷ʵ¼ÊÉϾÍÊÇÄں˶¯Ì¬¶¨Ê±Æ÷£¨ÏÂÃæÎÒÃǻῴµ½½ø³ÌµÄÕæÊµ¼ä¸ô¶¨Ê±Æ÷¾ÍÊÇÕâÑùͨ¹ýÄں˶¨Ê±Æ÷À´ÊµÏֵģ©¡£
¼ä¸ô¶¨Ê±Æ÷Ö÷Òª±»Ó¦ÓÃÔÚÓû§½ø³ÌÉÏ¡£Ã¿¸öLinux½ø³Ì¶¼ÓÐÈý¸öÏ໥¹ØÁªµÄ¼ä¸ô¶¨Ê±Æ÷¡£Æä¸÷×Եļä¸ô¼ÆÊýÆ÷¶¼¶¨ÒåÔÚ½ø³ÌµÄ
task_struct½á¹¹ÖУ¬ÈçÏÂËùʾ£¨include/linux/sched.h£©£º
struct task_struct£û
¡­¡­
unsigned long it_real_value, it_prof_value, it_virt_value;
unsigned long it_real_incr, it_prof_incr, it_virt_incr;
struct timer_list real_timer;
¡­¡­
}
£¨1£©ÕæÊµ¼ä¸ô¶¨Ê±Æ÷£¨ITIMER_REAL£©£ºÕâÖÖ¼ä¸ô¶¨Ê±Æ÷ÔÚÆô¶¯ºó£¬²»¹Ü½ø³ÌÊÇ·ñÔËÐУ¬Ã¿¸öʱÖӵδ𶼽«Æä¼ä¸ô¼ÆÊýÆ÷¼õ1¡£µ±
¼õµ½0ֵʱ£¬ÄÚºËÏò½ø³Ì·¢ËÍSIGALRMÐźš£½á¹¹ÀàÐÍtask_structÖеijÉÔ±it_real_incrÔò±íÊ¾ÕæÊµ¼ä¸ô¶¨Ê±Æ÷µÄ¼ä¸ô¼ÆÊýÆ÷µÄ
³õʼֵ£¬¶ø³ÉÔ±it_real_valueÔò±íÊ¾ÕæÊµ¼ä¸ô¶¨Ê±Æ÷µÄ¼ä¸ô¼ÆÊýÆ÷µÄµ±Ç°Öµ¡£ÓÉÓÚÕâÖÖ¼ä¸ô¶¨Ê±Æ÷±¾ÖÊÉÏÓëÉÏÒ»½ÚµÄÄں˶¨Ê±Æ÷
ʱһÑùµÄ£¬Òò´ËLinuxʵ¼ÊÉÏÊÇͨ¹ýreal_timerÕâ¸öÄÚǶÔÚtask_struct½á¹¹ÖеÄÄں˶¯Ì¬¶¨Ê±Æ÷À´ÊµÏÖÕæÊµ¼ä¸ô¶¨Ê±Æ÷
ITIMER_REALµÄ¡£
£¨2£©ÐéÄâ¼ä¸ô¶¨Ê±Æ÷ITIMER_VIRT£ºÒ²³ÆÎª½ø³ÌµÄÓû§Ì¬¼ä¸ô¶¨Ê±Æ÷¡£½á¹¹ÀàÐÍtask_structÖгÉÔ±it_virt_incrºÍ
it_virt_value·Ö±ð±íʾÐéÄâ¼ä¸ô¶¨Ê±Æ÷µÄ¼ä¸ô¼ÆÊýÆ÷µÄ³õʼֵºÍµ±Ç°Öµ£¬¶þÕß¾ùÒÔʱÖӵδð´ÎÊýλ¼ÆÊýµ¥Î»¡£µ±ÐéÄâ¼ä¸ô¶¨Ê±Æ÷
Æô¶¯ºó£¬Ö»Óе±½ø³ÌÔÚÓû§Ì¬ÏÂÔËÐÐʱ£¬Ò»´ÎʱÖӵδð²ÅÄÜʹ¼ä¸ô¼ÆÊýÆ÷µ±Ç°Öµit_virt_value¼õ1¡£µ±¼õµ½0ֵʱ£¬ÄÚºËÏò½ø³Ì·¢
ËÍSIGVTALRMÐźţ¨ÐéÄâÄÖÖÓÐźţ©£¬²¢½«it_virt_valueÖØÖÃΪ³õÖµit_virt_incr¡£¾ßÌåÇë¼û7.4.3½ÚÖеÄdo_it_virt()º¯
ÊýµÄʵÏÖ¡£
£¨3£©PROF¼ä¸ô¶¨Ê±Æ÷ITIMER_PROF£º½ø³ÌµÄtask_struct½á¹¹ÖеÄit_prof_valueºÍit_prof_incr³ÉÔ±·Ö±ð±íʾPROF¼ä¸ô¶¨
ʱÆ÷µÄ¼ä¸ô¼ÆÊýÆ÷µÄµ±Ç°ÖµºÍ³õʼֵ£¨¾ùÒÔʱÖӵδðΪµ¥Î»£©¡£µ±Ò»¸ö½ø³ÌµÄPROF¼ä¸ô¶¨Ê±Æ÷Æô¶¯ºó£¬ÔòÖ»Òª¸Ã½ø³Ì´¦ÓÚÔËÐÐÖУ¬
¶ø²»¹ÜÊÇÔÚÓû§Ì¬»òºËÐÄ̬ÏÂÖ´ÐУ¬Ã¿¸öʱÖӵδð¶¼Ê¹¼ä¸ô¼ÆÊýÆ÷it_prof_valueÖµ¼õ1¡£µ±¼õµ½0ֵʱ£¬ÄÚºËÏò½ø³Ì·¢ËÍSIGPROF
Ðźţ¬²¢½«it_prof_valueÖØÖÃΪ³õÖµit_prof_incr¡£¾ßÌåÇë¼û7.4.3½ÚµÄdo_it_prof()º¯Êý¡£
LinuxÔÚinclude/linux/time.hÍ·ÎļþÖÐΪÉÏÊöÈýÖÖ½ø³Ì¼ä¸ô¶¨Ê±Æ÷¶¨ÒåÁËË÷Òý±êʶ£¬ÈçÏÂËùʾ£º
#define ITIMER_REAL 0
#define ITIMER_VIRTUAL 1
#define ITIMER_PROF 2

7£®7£®1 Êý¾Ý½á¹¹itimerval
ËäÈ»£¬ÔÚÄÚºËÖмä¸ô¶¨Ê±Æ÷µÄ¼ä¸ô¼ÆÊýÆ÷ÊÇÒÔʱÖӵδð´ÎÊýΪµ¥Î»£¬µ«ÊÇÈÃÓû§ÒÔʱÖӵδðΪµ¥Î»À´Ö¸¶¨¼ä¸ô¶¨Ê±Æ÷µÄ¼ä¸ô¼ÆÊýÆ÷µÄ
³õÖµÏÔÈ»ÊDz»Ì«·½±ãµÄ£¬ÒòΪÓû§Ï°¹ßµÄʱ¼äµ¥Î»ÊÇÃë¡¢ºÁÃë»ò΢ÃëµÈ¡£ËùÒÔLinux¶¨ÒåÁËÊý¾Ý½á¹¹itimervalÀ´ÈÃÓû§ÒÔÃë»ò΢Ãë
Ϊµ¥Î»Ö¸¶¨¼ä¸ô¶¨Ê±Æ÷µÄʱ¼ä¼ä¸ôÖµ¡£Æä¶¨ÒåÈçÏ£¨include/linux/time.h£©£º
struct itimerval {
struct timeval it_interval; /* timer interval */
struct timeval it_value; /* current value */
};
ÆäÖУ¬it_interval³ÉÔ±±íʾ¼ä¸ô¼ÆÊýÆ÷µÄ³õʼֵ£¬¶øit_value³ÉÔ±±íʾ¼ä¸ô¼ÆÊýÆ÷µÄµ±Ç°Öµ¡£ÕâÁ½¸ö³ÉÔ±¶¼ÊÇtimeval½á¹¹ÀàÐÍ
µÄ±äÁ¿£¬Òò´ËÆä¾«¶È¿ÉÒԴﵽ΢Ãë¼¶¡£

l timevalÓëjiffiesÖ®¼äµÄÏ໥ת»»
ÓÉÓÚ¼ä¸ô¶¨Ê±Æ÷µÄ¼ä¸ô¼ÆÊýÆ÷µÄÄÚ²¿±íʾ·½Ê½ÓëÍⲿ±íÏÖ·½Ê½»¥²»Ïàͬ£¬Òò´ËÓбØÒªÊµÏÖÒÔ΢ÃëΪµ¥Î»µÄtimeval½á¹¹ºÍΪʱÖӵδð
´ÎÊýµ¥Î»µÄjiffiesÖ®¼äµÄÏ໥ת»»¡£Îª´Ë£¬LinuxÔÚkernel/itimer.cÖÐʵÏÖÁËÁ½¸öº¯ÊýʵÏÖ¶þÕߵĻ¥Ïàת»»¡ª¡ª
tvtojiffies()º¯ÊýºÍjiffiestotv()º¯Êý¡£ËüÃǵÄÔ´ÂëÈçÏ£º
static unsigned long tvtojiffies(struct timeval *value)
{
unsigned long sec = (unsigned) value->tv_sec;
unsigned long usec = (unsigned) value->tv_usec;

if (sec > (ULONG_MAX / HZ))
return ULONG_MAX;
usec += 1000000 / HZ - 1;
usec /= 1000000 / HZ;
return HZ*sec+usec;
}

static void jiffiestotv(unsigned long jiffies, struct timeval *value)
{
value->tv_usec = (jiffies % HZ) * (1000000 / HZ);
value->tv_sec = jiffies / HZ;
}

7£®7£®2 ÕæÊµ¼ä¸ô¶¨Ê±Æ÷ITIMER_REALµÄµ×²ãÔËÐлúÖÆ
¼ä¸ô¶¨Ê±Æ÷ITIMER_VIRTºÍITIMER_PROFµÄµ×²ãÔËÐлúÖÆÊÇ·Ö±ðͨ¹ýº¯Êýdo_it_virt£¨£©º¯ÊýºÍdo_it_prof£¨£©º¯ÊýÀ´ÊµÏÖ
µÄ£¬ÕâÀï¾Í²»ÔÙÖØÊö£¨¿ÉÒԲμû7.4.3½Ú£©¡£
ÓÉÓÚ¼ä¸ô¶¨Ê±Æ÷ITIMER_REAL±¾ÖÊÉÏÓëÄں˶¯Ì¬¶¨Ê±Æ÷²¢ÎÞÇø±ð¡£Òò´ËÄÚºËʵ¼ÊÉÏÊÇͨ¹ýÄں˶¯Ì¬¶¨Ê±Æ÷À´ÊµÏÖ½ø³ÌµÄ
ITIMER_REAL¼ä¸ô¶¨Ê±Æ÷µÄ¡£Îª´Ë£¬task_struct½á¹¹ÖÐרÃÅÉèÁ¢Ò»¸ötimer_list½á¹¹ÀàÐ͵ijÉÔ±±äÁ¿real_timer¡£¶¯Ì¬¶¨Ê±
Æ÷real_timerµÄº¯ÊýÖ¸Õëfunction×ÜÊDZ»task_struct½á¹¹µÄ³õʼ»¯ºêINIT_TASKÉèÖÃΪָÏòº¯Êýit_real_fn()¡£ÈçÏÂËùʾ
£¨include/linux/sched.h£©£º
#define INIT_TASK(tsk)
¡­¡­
real_timer£º {
function£º it_real_fn
}
¡­¡­
}
¶øreal_timerÁ´±íÔªËØlistºÍdata³ÉÔ±×ÜÊDZ»½ø³Ì´´½¨Ê±·Ö±ð³õʼ»¯Îª¿ÕºÍ½ø³Ìtask_struct½á¹¹µÄµØÖ·£¬ÈçÏÂËùʾ£¨kernel/
fork.c£©£º
int do_fork(¡­¡­)
{
¡­¡­
p->it_real_value = p->it_virt_value = p->it_prof_value = 0;
p->it_real_incr = p->it_virt_incr = p->it_prof_incr = 0;
init_timer(&p->real_timer);
p->real_timer.data = (unsigned long)p;
¡­¡­
}
µ±Óû§Í¨¹ýsetitimer()ϵͳµ÷ÓÃÀ´ÉèÖýø³ÌµÄITIMER_REAL¼ä¸ô¶¨Ê±Æ÷ʱ£¬it_real_incr±»ÉèÖóɷÇÁãÖµ£¬ÓÚÊǸÃϵͳµ÷ÓÃÏà
Ó¦µØÉèÖúÃreal_timer.expiresÖµ£¬È»ºó½ø³ÌµÄreal_timer¶¨Ê±Æ÷¾Í±»¼ÓÈëµ½Äں˶¯Ì¬¶¨Ê±Æ÷Á´±íÖУ¬ÕâÑù¸Ã½ø³ÌµÄ
ITIMER_REAL¼ä¸ô¶¨Ê±Æ÷¾Í±»Æô¶¯ÁË¡£µ±real_timer¶¨Ê±Æ÷µ½ÆÚʱ£¬ËüµÄ¹ØÁªº¯Êýit_real_fn()½«±»Ö´ÐС£×¢Ò⣡ËùÓнø³ÌµÄ
real_timer¶¨Ê±Æ÷µÄfunctionº¯ÊýÖ¸Õë¶¼Ö¸Ïòit_real_fn()Õâͬһ¸öº¯Êý£¬Òò´Ëit_real_fn()º¯Êý±ØÐëͨ¹ýÆä²ÎÊýÀ´Ê¶±ðÊÇ
ÄÄÒ»¸ö½ø³Ì£¬Îª´ËËü½«unsigned longÀàÐ͵IJÎÊýp½âÊÍΪ½ø³Ìtask_struct½á¹¹µÄµØÖ·¡£¸Ãº¯ÊýµÄÔ´ÂëÈçÏ£¨kernel/
itimer.c£©£º
void it_real_fn(unsigned long __data)
{
struct task_struct * p = (struct task_struct *) __data;
unsigned long interval;

send_sig(SIGALRM, p, 1);
interval = p->it_real_incr;
if (interval) {
if (interval > (unsigned long) LONG_MAX)
interval = LONG_MAX;
p->real_timer.expires = jiffies + interval;
add_timer(&p->real_timer);
}
}
º¯Êýit_real_fn()µÄÖ´Ðйý³Ì´óÖÂÈçÏ£º
£¨1£©Ê×ÏȽ«²ÎÊýpͨ¹ýÇ¿ÖÆÀàÐÍת»»½âÊÍΪ½ø³ÌµÄtask_struct½á¹¹ÀàÐ͵ÄÖ¸Õë¡£
£¨2£©Ïò½ø³Ì·¢ËÍSIGALRMÐźš£
£¨3£©ÔÚ½ø³ÌµÄit_real_incr·Ç0µÄÇé¿öϼÌÐøÆô¶¯real_timer¶¨Ê±Æ÷¡£Ê×ÏÈ£¬¼ÆËãreal_timer¶¨Ê±Æ÷µÄexpiresֵΪ
£¨jiffies£«it_real_incr£©¡£È»ºó£¬µ÷ÓÃadd_timer()º¯Êý½«real_timer¼ÓÈëµ½Äں˶¯Ì¬¶¨Ê±Æ÷Á´±íÖС£

7£®7£®3 itimer¶¨Ê±Æ÷µÄϵͳµ÷ÓÃ
Óëitimer¶¨Ê±Æ÷Ïà¹ØµÄsyscallÓÐÁ½¸ö£ºgetitimer()ºÍsetitimer()¡£ÆäÖУ¬getitimer()ÓÃÓÚ²éѯµ÷Óýø³ÌµÄÈý¸ö¼ä¸ô¶¨Ê±
Æ÷µÄÐÅÏ¢£¬¶øsetitimer()ÔòÓÃÀ´ÉèÖõ÷Óýø³ÌµÄÈý¸ö¼ä¸ô¶¨Ê±Æ÷¡£ÕâÁ½¸ösyscall¶¼ÊÇÏÖÔÚkernel/itimer.cÎļþÖС£

7£®7£®3£®1 getitimer()ϵͳµ÷ÓõÄʵÏÖ
º¯Êýsys_getitimer()ÓÐÁ½¸ö²ÎÊý£º£¨1£©which£¬Ö¸¶¨²éѯµ÷Óýø³ÌµÄÄÄÒ»¸ö¼ä¸ô¶¨Ê±Æ÷£¬Æäȡֵ¿ÉÒÔÊÇ
ITIMER_REAL¡¢ITIMER_VIRTºÍITIMER_PROFÈýÕßÖ®Ò»¡££¨2£©valueÖ¸Õ룬ָÏòÓû§¿Õ¼äÖеÄÒ»¸öitimerval½á¹¹£¬ÓÃÓÚ½ÓÊÕ²é
ѯ½á¹û¡£¸Ãº¯ÊýµÄÔ´ÂëÈçÏ£º
/* SMP: Only we modify our itimer values. */
asmlinkage long sys_getitimer(int which, struct itimerval *value)
{
int error = -EFAULT;
struct itimerval get_buffer;

if (value) {
error = do_getitimer(which, &get_buffer);
if (!error &&
copy_to_user(value, &get_buffer, sizeof(get_buffer)))
error = -EFAULT;
}
return error;
}
ÏÔÈ»£¬sys_getitimer()º¯ÊýÖ÷Ҫͨ¹ýdo_getitimer()º¯ÊýÀ´²éѯµ±Ç°½ø³ÌµÄ¼ä¸ô¶¨Ê±Æ÷ÐÅÏ¢£¬²¢½«²éѯ½á¹û±£´æÔÚÄں˿ռäµÄ
½á¹¹±äÁ¿get_bufferÖС£È»ºó£¬µ÷ÓÃcopy_to_usr()ºê½«get_bufferÖнá¹û¿½±´µ½Óû§¿Õ¼ä»º³åÇøÖС£
º¯Êýdo_getitimer()µÄÔ´ÂëÈçÏ£¨kernel/itimer.c£©£º
int do_getitimer(int which, struct itimerval *value)
{
register unsigned long val, interval;

switch (which) {
case ITIMER_REAL:
interval = current->it_real_incr;
val = 0;
/*
* FIXME! This needs to be atomic, in case the kernel timer happens!
*/
if (timer_pending(¡èt->real_timer)) {
val = current->real_timer.expires - jiffies;

/* look out for negative/zero itimer.. */
if ((long) val it_virt_value;
interval = current->it_virt_incr;
break;
case ITIMER_PROF:
val = current->it_prof_value;
interval = current->it_prof_incr;
break;
default:
return(-EINVAL);
}
jiffiestotv(val, &value->it_value);
jiffiestotv(interval, &value->it_interval);
return 0;
}
²éѯµÄ¹ý³ÌÈçÏ£º
£¨1£©Ê×ÏÈ£¬Óþֲ¿±äÁ¿valºÍinterval·Ö±ð±íʾ´ý²éѯ¼ä¸ô¶¨Ê±Æ÷µÄ¼ä¸ô¼ÆÊýÆ÷µÄµ±Ç°ÖµºÍ³õʼֵ¡£
£¨2£©Èç¹ûwhich£½ITIMER_REAL£¬Ôò²éѯµ±Ç°½ø³ÌµÄITIMER_REAL¼ä¸ô¶¨Ê±Æ÷¡£ÓÚÊÇ´Ócurrent->it_real_incrÖеõ½
ITIMER_REAL¼ä¸ô¶¨Ê±Æ÷µÄ¼ä¸ô¼ÆÊýÆ÷µÄ³õʼֵ£¬²¢½«Æä±£´æµ½interval¾Ö²¿±äÁ¿ÖС£¶ø¶ÔÓÚ¼ä¸ô¼ÆÊýÆ÷µÄµ±Ç°Öµ£¬ÓÉÓÚ
ITITMER_REAL¼ä¸ô¶¨Ê±Æ÷ÊÇͨ¹ýreal_timerÕâ¸öÄں˶¯Ì¬¶¨Ê±Æ÷À´ÊµÏֵģ¬Òò´Ë²»ÄÜͨ¹ýcurrent->it_real_valueÀ´»ñµÃ
ITIMER_REAL¼ä¸ô¶¨Ê±Æ÷µÄ¼ä¸ô¼ÆÊýÆ÷µÄµ±Ç°Öµ£¬¶ø±ØÐëͨ¹ýreal_timerÀ´µÃµ½Õâ¸öÖµ¡£Îª´ËÏÈÓÃtimer_pending()º¯ÊýÀ´ÅжÏ
current->real_timerÊÇ·ñÒѱ»Æð¶¯¡£Èç¹ûδÆô¶¯£¬Ôò˵Ã÷ITIMER_REAL¼ä¸ô¶¨Ê±Æ÷ҲδÆô¶¯£¬Òò´ËÆä¼ä¸ô¼ÆÊýÆ÷µÄµ±Ç°Öµ¿Ï¶¨
ÊÇ0¡£Òò´Ë½«val±äÁ¿¼òµ¥µØÖÃ0¾Í¿ÉÒÔÁË¡

À´¶¥Ò»ÏÂ
½ü»ØÊ×Ò³
·µ»ØÊ×Ò³
·¢±íÆÀÂÛ ¹²ÓÐÌõÆÀÂÛ
Óû§Ãû: ÃÜÂë:
ÑéÖ¤Âë: ÄäÃû·¢±í
Ïà¹ØÎÄÕÂ
    ÎÞÏà¹ØÐÅÏ¢
À¸Ä¿¸üÐÂ
À¸Ä¿ÈÈÃÅ