<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 閱讀(302) 評論(0)  編輯  收藏 所屬分類: linux/UNIX 應用開發
    主站蜘蛛池模板: 美女被免费网站在线视频免费| 亚洲人成网站在线观看播放动漫| 亚洲成a∧人片在线观看无码| 一二三四免费观看在线视频中文版| 久久久久亚洲Av无码专| 久草免费手机视频| 99人中文字幕亚洲区| 30岁的女人韩剧免费观看| 久久精品九九亚洲精品| 国产成人福利免费视频| 亚洲高清一区二区三区| 免费视频中文字幕| 欧洲美女大片免费播放器视频| 亚洲精品网站在线观看不卡无广告| 一级全免费视频播放| 国产亚洲精午夜久久久久久| 精品视频一区二区三区免费| 中文字幕亚洲免费无线观看日本 | 国内一级一级毛片a免费| 亚洲Av永久无码精品一区二区| 午夜两性色视频免费网站| 黄色免费网址在线观看| 亚洲自偷自偷图片| 无码中文字幕av免费放dvd| 亚洲啪啪免费视频| 国产精品成人四虎免费视频| 青草青草视频2免费观看| 亚洲精品无码永久中文字幕| 99热这里只有精品免费播放| 亚洲免费福利在线视频| 亚洲国产精品成人一区| 一级毛片免费在线| 亚洲色图古典武侠| 四虎在线播放免费永久视频 | 午夜免费福利小电影| 77777午夜亚洲| 亚洲综合国产一区二区三区| 5555在线播放免费播放| 黄页网站在线免费观看| 久久精品九九亚洲精品| 四虎永久免费地址在线网站|