• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

             Linux下的定時(shí)器有兩種,以下分別介紹:
             
              1、alarm
             
              如果不要求很精確的話,用alarm()和signal()就夠了
             
              unsigned int alarm(unsigned int seconds)
             
              函數(shù)說明: alarm()用來設(shè)置信號(hào)SIGALRM在經(jīng)過參數(shù)seconds指定的秒數(shù)后傳送給目前的進(jìn)程。如果參數(shù)seconds為0,則之前設(shè)置的鬧鐘會(huì)被取消,并將剩下的時(shí)間返回。
             
              返回值: 返回之前鬧鐘的剩余秒數(shù),如果之前未設(shè)鬧鐘則返回0.
             
              alarm()執(zhí)行后,進(jìn)程將繼續(xù)執(zhí)行,在后期(alarm以后)的執(zhí)行過程中將會(huì)在seconds秒后收到信號(hào)SIGALRM并執(zhí)行其處理函數(shù)。
             
              
            #include
            #include
            #include
            void sigalrm_fn(int sig)
            {
            printf("alarm!\n");
            alarm(2);
            return;
            }
            int main(void)
            {
            signal(SIGALRM, sigalrm_fn);
            alarm(1);
            while(1) pause();
            }

             

             
              2、setitimer()
             
              int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));
             
              setitimer()比alarm功能強(qiáng)大,支持3種類型的定時(shí)器:
             
              ITIMER_REAL : 以系統(tǒng)真實(shí)的時(shí)間來計(jì)算,它送出SIGALRM信號(hào)。
             
              ITIMER_VIRTUAL : -以該進(jìn)程在用戶態(tài)下花費(fèi)的時(shí)間來計(jì)算,它送出SIGVTALRM信號(hào)。
             
              ITIMER_PROF : 以該進(jìn)程在用戶態(tài)下和內(nèi)核態(tài)下所費(fèi)的時(shí)間來計(jì)算,它送出SIGPROF信號(hào)。
             
              setitimer()第一個(gè)參數(shù)which指定定時(shí)器類型(上面三種之一);第二個(gè)參數(shù)是結(jié)構(gòu)itimerval的一個(gè)實(shí)例;第三個(gè)參數(shù)可不做處理。
             
              setitimer()調(diào)用成功返回0,否則返回-1.
             
              下面是關(guān)于setitimer調(diào)用的一個(gè)簡(jiǎn)單示范,在該例子中,每隔一秒發(fā)出一個(gè)SIGALRM,每隔0.5秒發(fā)出一個(gè)SIGVTALRM信號(hào):
             
              
            #include
            #include
            #include
            #include
            #include
            #include
            int sec;
            void sigroutine(int signo){
            switch (signo){
            case SIGALRM:
            printf("Catch a signal -- SIGALRM \n");
            signal(SIGALRM, sigroutine);
            break;
            case SIGVTALRM:
            printf("Catch a signal -- SIGVTALRM \n");
            signal(SIGVTALRM, sigroutine);
            break;
            }
            return;
            }
            int main()
            {
            struct itimerval value, ovalue, value2; //(1)
            sec = 5;
            printf("process id is %d\n", getpid());
            signal(SIGALRM, sigroutine);
            signal(SIGVTALRM, sigroutine);
            value.it_value.tv_sec = 1;
            value.it_value.tv_usec = 0;
            value.it_interval.tv_sec = 1;
            value.it_interval.tv_usec = 0;
            setitimer(ITIMER_REAL, &value, &ovalue); //(2)
            value2.it_value.tv_sec = 0;
            value2.it_value.tv_usec = 500000;
            value2.it_interval.tv_sec = 0;
            value2.it_interval.tv_usec = 500000;
            setitimer(ITIMER_VIRTUAL, &value2, &ovalue);
            for(;;)
            ;
            }

             

             
              (1) struct itimerval
             
              
            struct itimerval {
            struct timeval it_interval; /* timer interval */
            struct timeval it_value; /* current value */
            };
            itimerval: i --> interval
            val --> value

             

             
              itimerval結(jié)構(gòu)中的it_value是減少的時(shí)間,當(dāng)這個(gè)值為0的時(shí)候就發(fā)出相應(yīng)的信號(hào)了。 然后再將it_value設(shè)置為it_interval值。
             
              (2) setitimer()
             
              setitimer()為其所在進(jìn)程設(shè)置一個(gè)定時(shí)器,如果itimerval.it_interval不為0(it_interval的兩個(gè)域都不為0),則該定時(shí)器將持續(xù)有效(每隔一段時(shí)間就會(huì)發(fā)送一個(gè)信號(hào))
             
              注意:Linux信號(hào)機(jī)制基本上是從Unix系統(tǒng)中繼承過來的。早期Unix系統(tǒng)中的信號(hào)機(jī)制比較簡(jiǎn)單和原始,后來在實(shí)踐中暴露出一些問題,因此,把那些建立在早期機(jī)制上的信號(hào)叫做"不可靠信號(hào)",信號(hào)值小于SIGRTMIN(SIGRTMIN=32,SIGRTMAX=63)的信號(hào)都是不可靠信號(hào)。這就是"不可靠信號(hào)"的來源。它的主要問題是:進(jìn)程每次處理信號(hào)后,就將對(duì)信號(hào)的響應(yīng)設(shè)置為默認(rèn)動(dòng)作。在某些情況下,將導(dǎo)致對(duì)信號(hào)的錯(cuò)誤處理;因此,用戶如果不希望這樣的操作,那么就要在信號(hào)處理函數(shù)結(jié)尾再一次調(diào)用signal(),重新安裝該信號(hào)

             

             

             

             

             

            亚洲?V乱码久久精品蜜桃 | 亚洲国产天堂久久综合| 亚洲国产成人久久综合野外| 久久无码一区二区三区少妇 | 美女久久久久久| 久久频这里精品99香蕉久| 热re99久久6国产精品免费| 久久se精品一区精品二区| 亚洲中文字幕伊人久久无码| 久久亚洲AV成人无码软件| 久久se精品一区二区影院| 精品国产乱码久久久久久1区2区| 久久影视综合亚洲| 久久夜色精品国产网站| 亚洲欧美日韩精品久久亚洲区| 69久久夜色精品国产69| 久久精品国产99久久久古代| 亚洲精品高清一二区久久| 精品久久久久久无码专区| 一本综合久久国产二区| 欧美亚洲另类久久综合| 国产精品99久久精品| 精品久久久久久久国产潘金莲| 99久久人人爽亚洲精品美女| 久久综合久久综合九色| 亚洲国产美女精品久久久久∴| 亚洲精品无码专区久久久| 久久人人爽人人精品视频| 免费观看成人久久网免费观看| 久久精品国产99国产精品亚洲| 欧美久久亚洲精品| 久久精品国产99久久丝袜| 无码任你躁久久久久久久| 久久综合狠狠综合久久激情 | 青青草原综合久久大伊人精品| 人妻无码中文久久久久专区| 一97日本道伊人久久综合影院| 美女久久久久久| 狠狠色丁香久久婷婷综合图片| 国内精品久久久久国产盗摄| 狠狠色综合网站久久久久久久|