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

libevent庫的使用--定時(shí)器的使用實(shí)例

 更新時(shí)間:2013年12月21日 15:29:09   作者:  
這篇文章主要介紹了libevent庫的使用--定時(shí)器的使用實(shí)例,有需要的朋友可以參考一下

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

#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <event.h>
#include <evhttp.h>

#define RELOAD_TIMEOUT 5
#define DEFAULT_FILE "sample.html"

char *filedata;
time_t lasttime = 0;
char filename[80];
int counter = 0;

void read_file()
{
  int size = 0;
  char *data;
  struct stat buf;

  stat(filename,&buf);

  if (buf.st_mtime > lasttime)
    {
      if (counter++)
        fprintf(stderr,"Reloading file: %s",filename);
      else
        fprintf(stderr,"Loading file: %s",filename);

      FILE *f = fopen(filename, "rb");
      if (f == NULL)
        {
          fprintf(stderr,"Couldn't open file\n");
          exit(1);
        }

      fseek(f, 0, SEEK_END);
      size = ftell(f);
      fseek(f, 0, SEEK_SET);
      data = (char *)malloc(size+1);
      fread(data, sizeof(char), size, f);
      filedata = (char *)malloc(size+1);
      strcpy(filedata,data);
      fclose(f);


      fprintf(stderr," (%d bytes)\n",size);
      lasttime = buf.st_mtime;
    }
}

void load_file()
{
  struct event *loadfile_event;
  struct timeval tv;

  read_file();

  tv.tv_sec = RELOAD_TIMEOUT;
  tv.tv_usec = 0;

  loadfile_event = malloc(sizeof(struct event));

  evtimer_set(loadfile_event,
              load_file,
              loadfile_event);

  evtimer_add(loadfile_event,
              &tv);
}

void generic_request_handler(struct evhttp_request *req, void *arg)
{
  struct evbuffer *evb = evbuffer_new();

  evbuffer_add_printf(evb, "%s",filedata);
  evhttp_send_reply(req, HTTP_OK, "Client", evb);
  evbuffer_free(evb);
}

int main(int argc, char *argv[])
{
  short          http_port = 8081;
  char          *http_addr = "192.168.0.22";
  struct evhttp *http_server = NULL;

  if (argc > 1)
    {
      strcpy(filename,argv[1]);
      printf("Using %s\n",filename);
    }
  else
    {
      strcpy(filename,DEFAULT_FILE);
    }

  event_init();

  load_file();

  http_server = evhttp_start(http_addr, http_port);
  evhttp_set_gencb(http_server, generic_request_handler, NULL);

  fprintf(stderr, "Server started on port %d\n", http_port);
  event_dispatch();
}

這個(gè)服務(wù)器的基本原理與前面的示例相同。首先,腳本設(shè)置一個(gè) HTTP 服務(wù)器,它只響應(yīng)對基本 URL 主機(jī)/端口組合的請求(不處理請求 URI)。第一步是裝載文件 (read_file())。在裝載最初的文件時(shí)和在計(jì)時(shí)器觸發(fā)回調(diào)時(shí)都使用此函數(shù)。
read_file() 函數(shù)使用 stat() 函數(shù)調(diào)用檢查文件的修改時(shí)間,只有在上一次裝載之后修改了文件的情況下,它才重新讀取文件的內(nèi)容。此函數(shù)通過調(diào)用 fread() 裝載文件數(shù)據(jù),把數(shù)據(jù)復(fù)制到另一個(gè)結(jié)構(gòu)中,然后使用 strcpy() 把數(shù)據(jù)從裝載的字符串轉(zhuǎn)移到全局字符串中。
load_file() 函數(shù)是觸發(fā)計(jì)時(shí)器時(shí)調(diào)用的函數(shù)。它通過調(diào)用 read_file() 裝載內(nèi)容,然后使用 RELOAD_TIMEOUT 值設(shè)置計(jì)時(shí)器,作為嘗試裝載文件之前的秒數(shù)。libevent 計(jì)時(shí)器使用 timeval 結(jié)構(gòu),允許按秒和毫秒指定計(jì)時(shí)器。計(jì)時(shí)器不是周期性的;當(dāng)觸發(fā)計(jì)時(shí)器事件時(shí)設(shè)置它,然后從事件隊(duì)列中刪除事件。
使用與前面的示例相同的格式編譯代碼:$ gcc -o basichttpfile basichttpfile.c -levent。
現(xiàn)在,創(chuàng)建作為數(shù)據(jù)使用的靜態(tài)文件;默認(rèn)文件是 sample.html,但是可以通過命令行上的第一個(gè)參數(shù)指定任何文件(見 清單 6)。
清單 6. 創(chuàng)建作為數(shù)據(jù)使用的靜態(tài)文件

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

$ ./basichttpfile
Loading file: sample.html (8046 bytes)
Server started on port 8081

現(xiàn)在,程序可以接受請求了,重新裝載計(jì)時(shí)器也啟動(dòng)了。如果修改 sample.html 的內(nèi)容,應(yīng)該會(huì)重新裝載此文件并在日志中記錄一個(gè)消息。例如,清單 7 中的輸出顯示初始裝載和兩次重新裝載:
清單 7. 輸出顯示初始裝載和兩次重新裝載

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

$ ./basichttpfile
Loading file: sample.html (8046 bytes)
Server started on port 8081
Reloading file: sample.html (8047 bytes)
Reloading file: sample.html (8048 bytes)

注意,要想獲得最大的收益,必須確保環(huán)境沒有限制打開的文件描述符數(shù)量??梢允褂?ulimit 命令修改限制(需要適當(dāng)?shù)臋?quán)限或根訪問)。具體的設(shè)置取決與您的 OS,但是在 Linux® 上可以用 -n 選項(xiàng)設(shè)置打開的文件描述符(和網(wǎng)絡(luò)套接字)的數(shù)量

相關(guān)文章

  • C/C++中static,const,inline三種關(guān)鍵字詳細(xì)總結(jié)

    C/C++中static,const,inline三種關(guān)鍵字詳細(xì)總結(jié)

    以下是對C/C++中static,const,inline的三種關(guān)鍵字進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • c語言中enum類型的用法案例講解

    c語言中enum類型的用法案例講解

    這篇文章主要介紹了c語言中enum類型的用法案例講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是本文的詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言實(shí)現(xiàn)出棧序列合法性判定

    C語言實(shí)現(xiàn)出棧序列合法性判定

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)出棧序列合法性判定,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • c++ 臨時(shí)對象的來源

    c++ 臨時(shí)對象的來源

    大家可能對這個(gè)臨時(shí)對象這個(gè)概念還不是很清楚,那么首先我們花一些時(shí)間來理解臨時(shí)對象
    2013-01-01
  • C++空指針void*的使用方法

    C++空指針void*的使用方法

    C++空指針void是一種通用指針類型,可以指向任何類型的數(shù)據(jù)或?qū)ο蟆K魂P(guān)心指向的數(shù)據(jù)或?qū)ο蟮念愋?,只關(guān)心指針本身的地址,在使用void指針時(shí),需要將其轉(zhuǎn)換為特定類型的指針,以便對其進(jìn)行操作或訪問其值,本文就給大家介紹一下C++空指針void的使用方法
    2023-06-06
  • 在c和c++中實(shí)現(xiàn)函數(shù)回調(diào)

    在c和c++中實(shí)現(xiàn)函數(shù)回調(diào)

    如何在c和c++中實(shí)現(xiàn)函數(shù)回調(diào)呢?現(xiàn)在小編就和大家分享一下在c/c++中實(shí)現(xiàn)函數(shù)回調(diào)的示例代碼,需要的朋友可以參考下
    2013-07-07
  • C++中 string 中的常用方法使用心得

    C++中 string 中的常用方法使用心得

    這篇文章主要介紹了C++中 string 中的常用方法使用心得,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C++中的常對象與常對象成員詳解

    C++中的常對象與常對象成員詳解

    常成員函數(shù)可以訪問常對象中的數(shù)據(jù)成員,但仍然不允許修改常對象中數(shù)據(jù)成員的值。有時(shí)在編程時(shí)有要求,一定要修改常對象成員中的某個(gè)數(shù)據(jù)成員的值(例如類中有一個(gè)用于計(jì)數(shù)的變量count,其值應(yīng)當(dāng)不能變化)
    2013-10-10
  • FFmpeg進(jìn)階教程之給視頻添加文字水印

    FFmpeg進(jìn)階教程之給視頻添加文字水印

    FFmpeg是一套可以用來記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計(jì)算機(jī)程序,下面這篇文章主要給大家介紹了關(guān)于FFmpeg進(jìn)階教程之給視頻添加文字水印的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C++學(xué)習(xí)之虛函數(shù)表與多態(tài)詳解

    C++學(xué)習(xí)之虛函數(shù)表與多態(tài)詳解

    這篇文章主要為大家詳細(xì)介紹了C++中虛函數(shù)表與多態(tài)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C++有一定的幫助,感興趣的小伙伴可以了解一下
    2023-03-03

最新評論

元阳县| 和龙市| 西充县| 吉木乃县| 信丰县| 怀化市| 开阳县| 逊克县| 奇台县| 山东省| 三台县| 万州区| 永平县| 宾阳县| 古蔺县| 道真| 丽江市| 成武县| 霍山县| 大姚县| 政和县| 会宁县| 龙岩市| 双牌县| 德昌县| 甘肃省| 秀山| 梨树县| 雅江县| 本溪市| 虞城县| 聊城市| 翁源县| 内乡县| 沁阳市| 万盛区| 徐闻县| 个旧市| 高密市| 七台河市| 新沂市|