多任務計時器anytime實現(xiàn)

利用信號知識褪子,實現(xiàn)多次任意時間調(diào)用函數(shù)

my_alarm.h文件

#ifndef __MY_ALARM_H
#define __MY_ALARM_H 

//最多創(chuàng)建1024個任務
#define MAX 1024

//函數(shù)定義
typedef void alarm_func_t(void*);

//添加任務排嫌,成功返回任務ID,失敗返回-1
int anytimer_alarm(int sec, alarm_func_t *func, void *ch);

//取消任務 成功返回0,失敗返回-1;
int anytimer_destory(int id);

#endif

my_alarm.c文件

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
#include <signal.h>

#include "my_alarm.h"

static void mouder_load(void);        //模塊掛載贸营,設置時間贾漏,信號等
static void handler(int s);           //信號行為
static void mouder_unload(void);      //模塊卸載,恢復時間具伍,信號
static int get_pos(void);             //找空閑位置

//定義任務結(jié)構(gòu)體
struct func_st
{
    int sec;                      //秒數(shù)
    alarm_func_t *func;           //用戶自定義函數(shù)
    void *ch;                     //函數(shù)參數(shù)
};

static struct func_st *line[MAX];      //定義1024長度的數(shù)組存儲結(jié)構(gòu)體地址
static int inited = 0;                 //設置計時器翅雏,只有當inited為0的時候才調(diào)用模塊掛載函數(shù)
struct sigaction oldact;               //舊的信號行為
struct itimerval olditv;               //舊的時間鬧鐘


//添加任務,成功返回任務ID人芽,失敗返回-1
int anytimer_alarm(int sec, alarm_func_t *func, void *ch)
{
    struct func_st *new;
    int pos;

    if(inited == 0)
    {
        mouder_load();
        inited = 1;
    }

    //找空位
    pos = get_pos();
    if(pos < 0)
        return -1;

    new=malloc(sizeof(*new));
    if(new == NULL)
        return -1;

    new -> sec = sec;
    new -> func = func;
    new -> ch = ch;

    line[pos] = new;

    return pos;
}



//取消任務 成功返回0望几,失敗返回-1;
int anytimer_destory(int id)
{
    free(line[id]);
    line[id] = NULL;
}



static void mouder_load(void)
{
    struct sigaction act;
    struct itimerval itv;

    act.sa_handler = handler;
    act.sa_flags = 0;
    sigemptyset(&act.sa_mask);
    sigaction(SIGALRM, &act, &oldact);

    itv.it_interval.tv_sec = 1;
    itv.it_interval.tv_usec = 0;
    itv.it_value.tv_sec = 1;
    itv.it_value.tv_usec = 0;
    setitimer(ITIMER_REAL, &itv, &olditv);

    atexit(mouder_unload);     //鉤子函數(shù)
}


static void handler(int s)
{
    int i;
    for(i=0; i<MAX; i++)
    {
        if (line[i] != NULL)    //找不為空的數(shù)組
        {
            if(line[i] -> sec != 0)                  //當結(jié)構(gòu)體的時間不等于0時,時間減少1
                line[i] -> sec -= 1;       
            else                                    //時間為0執(zhí)行用戶自定義函數(shù)萤厅,并銷毀該任務橄抹,由于對外提供銷毀函數(shù),所以可以由用戶調(diào)用銷毀惕味,類似父進程為子進程收尸函數(shù)wait()楼誓;
            {
                line[i] -> func(line[i]->ch);     
                anytimer_destory(i); 
            }
        }
    }
}

static int get_pos(void)
{
    for(int i=0; i<MAX; i++)
    {
        if(line[i] == NULL)
            return i;
    }
    return -1;
}

static void mouder_unload(void)
{
    sigaction(SIGALRM, &oldact, NULL);
    setitimer(ITIMER_REAL, &olditv, NULL);
}

調(diào)試文件alrm_hw.c

#include <stdio.h>
#include <unistd.h>

#include "my_alarm.h"

static void any1(void *s)
{
    printf("%s", (char *)s);
    fflush(NULL);
}

static void any2(void *s)
{
    printf("%s", (char *)s);
    fflush(NULL);
}

static void any3(void *s)
{
    printf("%s", (char *)s);
    fflush(NULL);
}

int main(void)
{
    anytimer_alarm(3, any1, "hello");
    anytimer_alarm(2, any2, "world");
    anytimer_alarm(5, any3, "apue");

    /*
     **world*hello**apue******
     */
    while (1) {
        write(1, "*", 1);
        sleep(1);
    }

    return 0;
}

makefile文件


SRC = alrm_hw.o my_alarm.o
OBJ = myalarm 

$(OBJ):$(SRC)
    gcc -o $@ $^

clean:
    rm *.o $(OBJ)

運行結(jié)果


程序運行結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市名挥,隨后出現(xiàn)的幾起案子疟羹,更是在濱河造成了極大的恐慌,老刑警劉巖躺同,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阁猜,死亡現(xiàn)場離奇詭異,居然都是意外死亡蹋艺,警方通過查閱死者的電腦和手機剃袍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捎谨,“玉大人民效,你說我怎么就攤上這事憔维。” “怎么了畏邢?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵业扒,是天一觀的道長。 經(jīng)常有香客問我舒萎,道長程储,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任臂寝,我火速辦了婚禮章鲤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咆贬。我一直安慰自己败徊,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布掏缎。 她就那樣靜靜地躺著皱蹦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪眷蜈。 梳的紋絲不亂的頭發(fā)上沪哺,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音端蛆,去河邊找鬼凤粗。 笑死酥泛,一個胖子當著我的面吹牛今豆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柔袁,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼呆躲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捶索?” 一聲冷哼從身側(cè)響起插掂,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腥例,沒想到半個月后辅甥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡燎竖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年璃弄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片构回。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡夏块,死狀恐怖疏咐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脐供,我是刑警寧澤浑塞,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站政己,受9級特大地震影響酌壕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜歇由,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一仅孩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧印蓖,春花似錦辽慕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至他宛,卻和暖如春船侧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背厅各。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工镜撩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人队塘。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓袁梗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親憔古。 傳聞我的和親對象是個殘疾皇子遮怜,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355