Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2096877
  • 博文数量: 229
  • 博客积分: 7217
  • 博客等级: 上校
  • 技术积分: 3224
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-19 17:23
个人简介

个人主页https://xugaoxiang.com,微信公众号: Dev_Club 或者搜索 程序员Club

文章分类

全部博文(229)

文章存档

2017年(1)

2016年(20)

2015年(23)

2013年(1)

2012年(23)

2011年(68)

2010年(62)

2009年(31)

分类: LINUX

2010-10-26 17:01:35

The libevent API provides a mechanism to execute a callback function when a specific event occurs on a file descriptor or after a timeout has been reached. Furthermore, libevent also support callbacks due to signals or regular timeouts.


1 Download

 


2 Installation

  tar xvf libevent-2.0.7-rc.tar.gz

  cd libevent-2.0.7-rc

  ./configure --enable-shared

  make

  sudo make install


3 Configuration

  Open file /etc/ld.so.conf and add a line
    /usr/local/lib

  sudo ldconfig

4 An example from libevent project 

/test.c*/
#include
#include
#ifndef WIN32
#include
#include
#include
#else
#include
#endif
#include
#include
#include
#include
#include

#include

void
fifo_read(int fd, short event, void *arg)
{
    char buf[255];
    int len;
    struct event *ev = arg;
#ifdef WIN32
    DWORD dwBytesRead;
#endif

    /* Reschedule this event */
    event_add(ev, NULL);

    fprintf(stderr, "fifo_read called with fd: %d, event: %d, arg: %p\n",
        fd, event, arg);
#ifdef WIN32
    len = ReadFile((HANDLE)fd, buf, sizeof(buf) - 1, &dwBytesRead, NULL);

    // Check for end of file.
    if(len && dwBytesRead == 0) {
        fprintf(stderr, "End Of File");
        event_del(ev);
        return;
    }

    buf[dwBytesRead + 1] = '\0';
#else
    len = read(fd, buf, sizeof(buf) - 1);

    if (len == -1) {
        perror("read");
        return;
    } else if (len == 0) {
        fprintf(stderr, "Connection closed\n");
        return;
    }

    buf[len] = '\0';
#endif
    fprintf(stdout, "Read: %s\n", buf);
}

int
main (int argc, char **argv)
{
    struct event evfifo;
#ifdef WIN32
    HANDLE socket;
    // Open a file.
    socket = CreateFile("test.txt",     // open File
            GENERIC_READ,                 // open for reading
            0,                            // do not share
            NULL,                         // no security
            OPEN_EXISTING,                // existing file only
            FILE_ATTRIBUTE_NORMAL,        // normal file
            NULL);                        // no attr. template

    if(socket == INVALID_HANDLE_VALUE)
        return 1;

#else
    struct stat st;
    char *fifo = "event.fifo";
    int socket;
 
    if (lstat (fifo, &st) == 0) {
        if ((st.st_mode & S_IFMT) == S_IFREG) {
            errno = EEXIST;
            perror("lstat");
            exit (1);
        }
    }

    unlink (fifo);
    if (mkfifo (fifo, 0600) == -1) {
        perror("mkfifo");
        exit (1);
    }

    /* Linux pipes are broken, we need O_RDWR instead of O_RDONLY */
#ifdef __linux
    socket = open (fifo, O_RDWR | O_NONBLOCK, 0);
#else
    socket = open (fifo, O_RDONLY | O_NONBLOCK, 0);
#endif

    if (socket == -1) {
        perror("open");
        exit (1);
    }

    fprintf(stderr, "Write data to %s\n", fifo);
#endif
    /* Initalize the event library */
    event_init();

    /* Initalize one event */
#ifdef WIN32
    event_set(&evfifo, (int)socket, EV_READ, fifo_read, &evfifo);
#else
    event_set(&evfifo, socket, EV_READ, fifo_read, &evfifo);
#endif

    /* Add it to the active events, without a timeout */
    event_add(&evfifo, NULL);
   
    event_dispatch();
#ifdef WIN32
    CloseHandle(socket);
#endif
    return (0);
}

gcc -o test test.c -levent

References:
1 ~provos/libevent/
2 ~provos/libevent/doxygen-2.0.1/



阅读(1899) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-10-27 17:42:36

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com