一江春水向東流

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

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

          ???????1、alarm
          ???????如果不要求很精確的話,用 alarm() 和 signal() 就夠了
          ???????????unsigned int alarm(unsigned int seconds)
          ???????專門為SIGALRM信號而設,在指定的時間seconds秒后,將向進程本身發(fā)送SIGALRM信號,又稱為鬧鐘時間。進程調(diào)用alarm后,任何以前的alarm()調(diào)用都將無效。如果參數(shù)seconds為零,那么進程內(nèi)將不再包含任何鬧鐘時間。如果調(diào)用alarm()前,進程中已經(jīng)設置了鬧鐘時間,則返回上一個鬧鐘時間的剩余時間,否則返回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 : ?以系統(tǒng)真實的時間來計算,它送出SIGALRM信號。 ?
          ???????ITIMER_VIRTUAL : ?以該行程真正有執(zhí)行的時間來計算,它送出SIGVTALRM信號。 ?
          ???????ITIMER_PROF : ?以行程真正有執(zhí)行及在核心中所費的時間來計算,它送出SIGPROF信號。 ?
          ???????Setitimer()第一個參數(shù)which指定定時器類型(上面三種之一);第二個參數(shù)是結(jié)構(gòu)itimerval的一個實例;第三個參數(shù)可不做處理。
          ???????Setitimer()調(diào)用成功返回0,否則返回-1。

          ???????下面是關(guān)于setitimer調(diào)用的一個簡單示范,在該例子中,每隔一秒發(fā)出一個SIGALRM,每隔0.5秒發(fā)出一個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系統(tǒng)中繼承過來的。早期Unix系統(tǒng)中的信號機制比較簡單和原始,后來在實踐中暴露出一些問題,因此,把那些建立在早期機制上的信號叫做"不可靠信號",信號值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的信號都是不可靠信號。這就是"不可靠信號"的來源。它的主要問題是:進程每次處理信號后,就將對信號的響應設置為默認動作。在某些情況下,將導致對信號的錯誤處理;因此,用戶如果不希望這樣的操作,那么就要在信號處理函數(shù)結(jié)尾再一次調(diào)用signal(),重新安裝該信號。
          ?
          posted on 2007-04-13 09:39 allic 閱讀(305) 評論(0)  編輯  收藏 所屬分類: linux/UNIX 應用開發(fā)
          主站蜘蛛池模板: 精河县| 苏尼特左旗| 柳江县| 克拉玛依市| 深州市| 宁乡县| 阜平县| 焦作市| 延长县| 宁河县| 淅川县| 凤凰县| 大足县| 双牌县| 台前县| 五河县| 七台河市| 兖州市| 古丈县| 平阴县| 德惠市| 同德县| 吉水县| 巩留县| 阳朔县| 鸡泽县| 涟源市| 天柱县| 天长市| 彭州市| 游戏| 永新县| 龙川县| 万山特区| 昌平区| 闵行区| 明溪县| 嘉善县| 桦南县| 双鸭山市| 屏东市|