簡體   English   中英

libevent-event_base_loop()是否應該重復獲取事件?

[英]libevent - event_base_loop() should it get events repeatly?

這是一個在Linux上使用libevent的簡單程序,它跟蹤stdout fd,當可寫時,回調會將一些信息打印到stdout


hello_libevent.c:

// libevent hello
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>

#include <event2/event.h>
#include <event2/thread.h>


void event_callback(evutil_socket_t fd, short events, void *arg) {
    if(events | EV_WRITE) {
        write(fd, "hello\n", 7);
    }

    sleep(1);
}

int libevent_test() {
    int opr;

    // enable pthread
    if(evthread_use_pthreads() == -1) {
        printf("error while evthread_use_pthreads(): %s\n", strerror(errno));
        return -1;
    }

    // create event_base
    struct event_base* eb;
    if((eb = event_base_new()) == NULL) {
        printf("error while event_base_new(): %s\n", strerror(errno));
        return -1;
    }

    // create event
    int fd_stdout = fileno(stdout);
    struct event* event_stdout;
    event_stdout = event_new(eb, fd_stdout, EV_WRITE, &event_callback, NULL);

    // add event as pending
    struct timeval timeout = {10, 0};
    if(event_add(event_stdout, &timeout) == -1) {
        printf("error while event_add(): %s\n", strerror(errno));
        return -1;
    }

    // dispatch
    if((opr = event_base_loop(eb, EVLOOP_NONBLOCK)) == -1) {
        printf("error while event_base_dispatch(): %s\n", strerror(errno));
        return -1;
    } else if(opr == 1) {
        printf("no more events\n");
    } else {
        printf("exit normally\n");
    }

    // free event
    event_free(event_stdout);

    return 0;
}

int main(int argc, char * argv[]) {
    return libevent_test();
}

編譯:

gcc -Wall hello_libevent.c -levent -levent_pthreads

執行結果:

hello
no more events

問題:

  • 在測試中,事件僅發生一次,這是預期的行為嗎? 還是應該循環獲取更多事件直到超時?
  • 如何使其連續獲得事件? 在已經是loop ,是否有必要在循環中調用event_base_loop

http://www.wangafu.net/~nickm/libevent-book/Ref3_eventloop.html看來,您可以在循環內調用event_base_loopevent_base_dispatch

while (1) { /* This schedules an exit ten seconds from now. */ event_base_loopexit(base, &ten_sec);`` event_base_dispatch(base); puts("Tick"); }

事件的主要目的是通知繁忙的線程有關其他地方發生的某些事件。 因此,這看起來合乎邏輯。

我認為event.h文件參考中提到的事件標志EV_PERSIST可能會有所幫助。

持續事件:激活后不會自動刪除。

當具有超時的持續事件被激活時,其超時將重置為0。

代替

//...
event_stdout = event_new(eb, fd_stdout, EV_WRITE, &event_callback, NULL);
//...

您可以將此標志傳遞給event_new

//...
event_stdout = event_new(eb, fd_stdout, EV_WRITE|EV_PERSIST, &event_callback, NULL);
//...

而代碼的其他部分則保持不變。 此時,您只需創建並添加一個事件,就無需在循環內調用event_base_loop。 編譯后的程序僅保留打印“ hello”的行,直到終止為止。

順便說一句,我注意到變化

write(fd, "hello\n", 7);

進入

write(fd, "hello\n", 6);

消除每行的開頭字符“ \\ 0”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM