最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用linux的timerfd_create實(shí)現(xiàn)計(jì)時(shí)器示例分享

 更新時(shí)間:2014年02月16日 16:03:32   作者:  
這篇文章主要介紹了利用linux的timerfd_create實(shí)現(xiàn)計(jì)時(shí)器示例,需要的朋友可以參考下

timer_poll.h

復(fù)制代碼 代碼如下:

/*
 * File:   timer_poll.h
 * Author: Administrator
 */

#ifndef TIMER_POLL_H
#define TIMER_POLL_H
#include <sys/types.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/epoll.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/timerfd.h>
#include <unistd.h>
#include <pthread.h>
#include <map>

#define MAXFDS 128
#define EVENTS 100
class timer;
typedef int(*timer_callback)(timer &);//user callback

class timer
{
public:

    timer() : timer_internal(0.0), cb(0), timer_id(0), repeat(0), userdata(0){}
    timer(double internal_value, int  (*callback)(timer &ptimer), void *data, int rep) : timer_internal(internal_value), cb(callback), userdata(data), repeat(rep)
    {
        timer_id = timerfd_create(CLOCK_REALTIME, 0);
        setNonBlock(timer_id);
    }

    timer(const timer &ptimer);
    timer & operator=(const timer &ptimer);
    int timer_start();
    int timer_stop();
    int timer_modify_internal(double timer_internal);

    int timer_get_id()
    {
        return timer_id;
    }

    void *timer_get_userdata()
    {
        return userdata;
    }

    timer_callback get_user_callback()
    {
        return cb;
    }

    ~timer()
    {
        timer_stop();
    }

private:

    bool setNonBlock (int fd)
    {
        int flags = fcntl (fd, F_GETFL, 0);
        flags |= O_NONBLOCK;
        if (-1 == fcntl (fd, F_SETFL, flags))
        {
            return false;
        }
        return true;
    }
    int     timer_id;
    double  timer_internal;
    void    *userdata;
    bool    repeat;//will the timer repeat or only once
    timer_callback cb;
} ;
class timers_poll
{
public:
    timers_poll(int max_num=128)
    {
        active = 1;
        epfd = epoll_create(max_num);
    }

    int timers_poll_add_timer(timer &ptimer);
    int timers_poll_del_timer(timer &ptimer);
    int run();

    int timers_poll_deactive()
    {
        active = 0;
    }

    ~ timers_poll()
    {

    }
private:
    int epfd;
    int active;
    std::map<int, timer> timers_map;
    /* data */
} ;
#endif /* TIMER_POLL_H */

timer_poll.cpp

復(fù)制代碼 代碼如下:

/*
 * File:   timer_poll.cpp
 * Author: Administrator
 */

#include <cstdlib>
#include "timer_poll.h"

using namespace std;

timer::timer(const timer& ptimer)
{
    timer_internal = ptimer.timer_internal;
    cb = ptimer.cb;
    timer_id = ptimer.timer_id;
    repeat = ptimer.repeat;
    userdata = ptimer.userdata;
}

timer & timer::operator =(const timer& ptimer)
{
    if (this == &ptimer)
    {
        return *this;
    }

    timer_internal = ptimer.timer_internal;
    cb = ptimer.cb;
    timer_id = ptimer.timer_id;
    repeat = ptimer.repeat;
    userdata = ptimer.userdata;
    return *this;
}

int timer::timer_start()
{
    struct itimerspec ptime_internal = {0};
    ptime_internal.it_value.tv_sec = (int) timer_internal;
    ptime_internal.it_value.tv_nsec = (timer_internal - (int) timer_internal)*1000000;
    if(repeat)
    {
        ptime_internal.it_interval.tv_sec = ptime_internal.it_value.tv_sec;
        ptime_internal.it_interval.tv_nsec = ptime_internal.it_value.tv_nsec;
    }

    timerfd_settime(timer_id, 0, &ptime_internal, NULL);
    return 0;
}

int timer::timer_stop()
{
    close(timer_id);
    return 0;
}

int timer::timer_modify_internal(double timer_internal)
{
    this->timer_internal = timer_internal;
    timer_start();
}

int timers_poll::timers_poll_add_timer(timer& ptimer)
{
    int timer_id = ptimer.timer_get_id();
    struct epoll_event ev;
    ev.data.fd = timer_id;
    ev.events = EPOLLIN | EPOLLET;
    timers_map[timer_id] = ptimer; //add or modify
    epoll_ctl (epfd, EPOLL_CTL_ADD, timer_id, &ev);
    ptimer.timer_start();

    return 0;
}

int timers_poll::timers_poll_del_timer(timer& ptimer)
{
    int timer_id = ptimer.timer_get_id();
    struct epoll_event ev;
    ev.data.fd = timer_id;
    ev.events = EPOLLIN | EPOLLET;
    epoll_ctl (epfd, EPOLL_CTL_DEL, timer_id, &ev);
    timers_map.erase(timer_id);

    return 0;
}

int timers_poll::run()
{
    char buf[128] ={0};
    for (; active ; )
    {
        struct epoll_event events[MAXFDS] ={0};
        int nfds = epoll_wait (epfd, events, MAXFDS, -1);
        for (int i = 0; i < nfds; ++i)
        {
            std::map<int, timer>::iterator itmp = timers_map.find(events[i].data.fd);
            if (itmp != timers_map.end())
            {
                //timer ptimer = itmp->second;
                while (read(events[i].data.fd, buf, 128) > 0);
                itmp->second.get_user_callback()(itmp->second);
            }
        }
    }
}

main.cpp

復(fù)制代碼 代碼如下:

/*
 * File:   main.cpp
 * Author: Administrator
 */

#include <cstdlib>
#include <iostream>

#include "timer_poll.h"

using namespace std;

int callback(timer &ptimer)
{
    printf("timer id=%d:%s\n", ptimer.timer_get_id(), (char *) ptimer.timer_get_userdata());
    return 0;
}

void *thread_fun(void *data)
{
    timers_poll *my_timers = (timers_poll *)data;
    my_timers->run();
}

/*
 *
 */
int main(int argc, char** argv)
{
    timers_poll my_timers(128);
    pthread_t thread_id = 0;
    pthread_create(&thread_id, NULL, thread_fun, &my_timers);

   
    timer timer1(1.05, callback, (void *) "hello 1",0);
    timer timer2(1.10, callback, (void *) "hello 2",0);

   // timer1.timer_start();
   // timer2.timer_start();

    my_timers.timers_poll_add_timer(timer1);
    my_timers.timers_poll_add_timer(timer2);

    sleep(5);
    my_timers.timers_poll_del_timer(timer2);
    cout<<"del complete"<<endl;
    timer1.timer_modify_internal(5.1);
    //timer2.timer_modify_internal(10.1);
    cout<<"modify complete"<<endl;
    sleep(4);
    //my_timers.timers_poll_del_timer(timer2);

    //sleep(5);

    //my_timers.timers_poll_deactive();

    pthread_join(thread_id,NULL);
    return 0;
}

相關(guān)文章

  • Shell中正則表達(dá)式及sed和awk常見問(wèn)題

    Shell中正則表達(dá)式及sed和awk常見問(wèn)題

    本文主要介紹了Shell中正則表達(dá)式及sed和awk常見問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Shell日志分析常用命令和例子

    Shell日志分析常用命令和例子

    這篇文章主要介紹了Shell日志分析常用命令和例子,本文重點(diǎn)在一樣實(shí)現(xiàn)日志分析命令語(yǔ)句例子上,本文給出了10條常用的分析實(shí)例,需要的朋友可以參考下
    2014-12-12
  • 詳談Linux netstat命令(高級(jí)面試必備)

    詳談Linux netstat命令(高級(jí)面試必備)

    下面小編就為大家?guī)?lái)一篇詳談Linux netstat命令(高級(jí)面試必備)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • 在linux shell腳本中root切換到普通用戶執(zhí)行腳本或命令的方法

    在linux shell腳本中root切換到普通用戶執(zhí)行腳本或命令的方法

    今天小編就為大家分享一篇在linux shell腳本中root切換到普通用戶執(zhí)行腳本或命令的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • 如何測(cè)試端口通不通(四種方法)

    如何測(cè)試端口通不通(四種方法)

    一般情況下使用"telnet ip port"判斷端口通不通.接下來(lái)通過(guò)本文給大家分享四種方法測(cè)試端口通不通,感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • pidof命令獲取不到程序的pid問(wèn)題解決

    pidof命令獲取不到程序的pid問(wèn)題解決

    這篇文章主要為大家介紹了pidof命令獲取不到程序的pid問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Shell腳本實(shí)現(xiàn)隨機(jī)數(shù)多種方法介紹(date、random、uuid)

    Shell腳本實(shí)現(xiàn)隨機(jī)數(shù)多種方法介紹(date、random、uuid)

    這篇文章主要介紹了Shell腳本實(shí)現(xiàn)隨機(jī)數(shù)多種方法介紹,本文講解了通過(guò)時(shí)間獲得隨機(jī)數(shù)、通過(guò)內(nèi)部系統(tǒng)變量、通過(guò)系統(tǒng)內(nèi)部唯一數(shù)據(jù)生成隨機(jī)數(shù)等方法,需要的朋友可以參考下
    2014-11-11
  • 使用shell腳本一鍵部署LNMP架構(gòu)的方法

    使用shell腳本一鍵部署LNMP架構(gòu)的方法

    這篇文章主要介紹了使用shell腳本一鍵部署LNMP架構(gòu)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • linux find命令將查找到的文件批量刪除方法

    linux find命令將查找到的文件批量刪除方法

    這篇文章主要介紹了linux find命令將查找到的文件批量刪除,文中給大家補(bǔ)充介紹了Linux中find三種刪除方式,常用于crontab定時(shí)任務(wù)和shell腳本,需要的朋友可以參考下
    2022-12-12
  • 用來(lái)查看linux內(nèi)存使用情況的shell腳本

    用來(lái)查看linux內(nèi)存使用情況的shell腳本

    本文為大家提供的這個(gè)腳本,通過(guò)查看status文件中VmRSS的字段來(lái)查看系統(tǒng)或進(jìn)程使用的內(nèi)存情況,有需要的朋友不妨參考下
    2013-02-02

最新評(píng)論

红安县| 台南市| 蕉岭县| 武山县| 新宁县| 镇远县| 凤翔县| 龙泉市| 五常市| 图们市| 兴城市| 满洲里市| 广德县| 苍梧县| 莱芜市| 永新县| 奉贤区| 额济纳旗| 安达市| 军事| 北辰区| 禄丰县| 泽普县| 鹤庆县| 清流县| 和静县| 永州市| 齐河县| 北川| 贵港市| 唐海县| 娄底市| 双辽市| 噶尔县| 沂南县| 漳浦县| 姜堰市| 南雄市| 温泉县| 大连市| 宁阳县|