¶¨Ê±Æ÷ |
| ʱ¼ä£º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¾Í¿ÉÒÔÁË¡
|
|
|
|
|
|