• <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++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            Linux下的定時器:alarm()與setitimer()

            Posted on 2008-08-27 09:12 Prayer 閱讀(387) 評論(0)  編輯 收藏 引用 所屬分類: LINUX/UNIX/AIX

             Linux下的定時器有兩種,以下分別介紹:
             
              1、alarm
             
              如果不要求很精確的話,用alarm()和signal()就夠了
             
              unsigned int alarm(unsigned int seconds)
             
              函數說明: alarm()用來設置信號SIGALRM在經過參數seconds指定的秒數后傳送給目前的進程。如果參數seconds為0,則之前設置的鬧鐘會被取消,并將剩下的時間返回。
             
              返回值: 返回之前鬧鐘的剩余秒數,如果之前未設鬧鐘則返回0.
             
              alarm()執行后,進程將繼續執行,在后期(alarm以后)的執行過程中將會在seconds秒后收到信號SIGALRM并執行其處理函數。
             
              
            #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功能強大,支持3種類型的定時器:
             
              ITIMER_REAL : 以系統真實的時間來計算,它送出SIGALRM信號。
             
              ITIMER_VIRTUAL : -以該進程在用戶態下花費的時間來計算,它送出SIGVTALRM信號。
             
              ITIMER_PROF : 以該進程在用戶態下和內核態下所費的時間來計算,它送出SIGPROF信號。
             
              setitimer()第一個參數which指定定時器類型(上面三種之一);第二個參數是結構itimerval的一個實例;第三個參數可不做處理。
             
              setitimer()調用成功返回0,否則返回-1.
             
              下面是關于setitimer調用的一個簡單示范,在該例子中,每隔一秒發出一個SIGALRM,每隔0.5秒發出一個SIGVTALRM信號:
             
              
            #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結構中的it_value是減少的時間,當這個值為0的時候就發出相應的信號了。 然后再將it_value設置為it_interval值。
             
              (2) setitimer()
             
              setitimer()為其所在進程設置一個定時器,如果itimerval.it_interval不為0(it_interval的兩個域都不為0),則該定時器將持續有效(每隔一段時間就會發送一個信號)
             
              注意:Linux信號機制基本上是從Unix系統中繼承過來的。早期Unix系統中的信號機制比較簡單和原始,后來在實踐中暴露出一些問題,因此,把那些建立在早期機制上的信號叫做"不可靠信號",信號值小于SIGRTMIN(SIGRTMIN=32,SIGRTMAX=63)的信號都是不可靠信號。這就是"不可靠信號"的來源。它的主要問題是:進程每次處理信號后,就將對信號的響應設置為默認動作。在某些情況下,將導致對信號的錯誤處理;因此,用戶如果不希望這樣的操作,那么就要在信號處理函數結尾再一次調用signal(),重新安裝該信號

             

             

             

             

             

            欧美无乱码久久久免费午夜一区二区三区中文字幕 | av无码久久久久久不卡网站| 久久精品国产亚洲精品| 武侠古典久久婷婷狼人伊人| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久电影网| 亚洲国产精品无码久久一线| 久久精品一区二区| 久久久久国产日韩精品网站| 尹人香蕉久久99天天拍| 99久久99久久精品国产| 精品无码久久久久国产动漫3d| 久久综合九色综合欧美狠狠| 久久久久久国产精品免费无码| 四虎久久影院| 成人久久久观看免费毛片| 无遮挡粉嫩小泬久久久久久久| 99精品久久精品一区二区| 一本色道久久综合狠狠躁篇| 91精品国产综合久久精品| 久久久亚洲精品蜜桃臀| 精品免费久久久久国产一区| 久久久免费精品re6| 久久乐国产精品亚洲综合| 狠狠色婷婷久久一区二区三区| 久久只有这精品99| 亚洲精品99久久久久中文字幕| 久久精品免费一区二区三区| 久久亚洲精品国产精品| 麻豆AV一区二区三区久久| 久久久久久久免费视频| 蜜桃麻豆www久久国产精品| 91精品国产91久久久久久| 欧美亚洲另类久久综合| 亚洲第一极品精品无码久久| 久久精品一本到99热免费| 久久人人爽人人爽人人av东京热 | 久久99热国产这有精品| 国内精品久久久久久99蜜桃| 久久99国产精品尤物| 久久国产精品成人片免费|