<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    一江春水向東流

    做一個有思想的人,期待與每一位熱愛思考的人交流,您的關注是對我最大的支持。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      44 隨筆 :: 139 文章 :: 81 評論 :: 0 Trackbacks
    Linux下的定時器有兩種,以下分別介紹:

    ???????1、alarm
    ???????如果不要求很精確的話,用 alarm() 和 signal() 就夠了
    ???????????unsigned int alarm(unsigned int seconds)
    ???????專門為SIGALRM信號而設,在指定的時間seconds秒后,將向進程本身發送SIGALRM信號,又稱為鬧鐘時間。進程調用alarm后,任何以前的alarm()調用都將無效。如果參數seconds為零,那么進程內將不再包含任何鬧鐘時間。如果調用alarm()前,進程中已經設置了鬧鐘時間,則返回上一個鬧鐘時間的剩余時間,否則返回0。

    ???????示例:
    ???????#include <stdio.h>
    ???????#include <unistd.h>
    ???????#include <signal.h>

    ???????void sigalrm_fn(int sig)
    ???????{
    ???????????????/* Do something */
    ???????????????printf("alarm!\n");

    ???????????????alarm(2);
    ???????????????return;
    ???????}

    ???????int main(void)
    ???????{
    ???????????????signal(SIGALRM, sigalrm_fn);
    ???????????????alarm(2);

    ???????????????/* Do someting */
    ???????????????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 <stdio.h>
    ???????#include <stdlib.h>
    ???????#include <unistd.h>
    ???????#include <signal.h>
    ???????#include <time.h>
    ???????#include <sys/time.h>

    ???????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;
    ???
    ???????????sec = 5;
    ???????????printf("process id is %d ", 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);

    ???????????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(;;)
    ???????????????;
    ???????}


    ??????? 該例子的屏幕拷貝如下:

    ???????localhost:~$ ./timer_test
    ???????process id is 579
    ???????Catch a signal – SIGVTALRM
    ???????Catch a signal – SIGALRM
    ???????Catch a signal – SIGVTALRM
    ???????Catch a signal – SIGVTALRM
    ???????Catch a signal – SIGALRM
    ???????Catch a signal –GVTALRM


    ???????注意:Linux信號機制基本上是從Unix系統中繼承過來的。早期Unix系統中的信號機制比較簡單和原始,后來在實踐中暴露出一些問題,因此,把那些建立在早期機制上的信號叫做"不可靠信號",信號值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的信號都是不可靠信號。這就是"不可靠信號"的來源。它的主要問題是:進程每次處理信號后,就將對信號的響應設置為默認動作。在某些情況下,將導致對信號的錯誤處理;因此,用戶如果不希望這樣的操作,那么就要在信號處理函數結尾再一次調用signal(),重新安裝該信號。
    ?
    posted on 2007-04-13 09:39 allic 閱讀(303) 評論(0)  編輯  收藏 所屬分類: linux/UNIX 應用開發
    主站蜘蛛池模板: 精品视频免费在线| 亚洲一级毛片视频| 免费国产a理论片| 波多野结衣久久高清免费 | 30岁的女人韩剧免费观看| 亚洲性日韩精品国产一区二区| 国产精品亚洲专区无码唯爱网| 四虎在线视频免费观看| 久久亚洲精品国产精品婷婷| 毛片免费观看的视频| 亚洲日韩国产二区无码| 全免费a级毛片免费**视频| 色偷偷噜噜噜亚洲男人| 亚洲不卡AV影片在线播放| 四虎国产精品成人免费久久 | 国产精品免费福利久久| 国产精品亚洲成在人线| 一级毛片免费观看| 亚洲欧洲国产综合| 四虎成人免费观看在线网址| 久久久久久久久无码精品亚洲日韩| 午夜国产大片免费观看| 一级毛片免费在线| 亚洲AV无码国产精品色午友在线| 2020因为爱你带字幕免费观看全集| 亚洲w码欧洲s码免费| 免费永久看黄在线观看app| aa毛片免费全部播放完整| 久久亚洲精品人成综合网| 一二三四在线观看免费高清中文在线观看 | 手机在线免费视频| 免费福利在线观看| 亚洲国产精品线在线观看| 全免费a级毛片免费**视频| 久久久久久毛片免费看| 亚洲欧洲日产国产最新| 免费观看国产精品| 日韩人妻一区二区三区免费| 亚洲日韩中文字幕无码一区| 一本色道久久综合亚洲精品| 精品国产污污免费网站aⅴ|