1

EVLOOP_NO_EXIT_ON_EMPTY フラグがバージョン 2.1.x の libevent でどのように機能するのか理解できません。

event_base にイベントを追加しないと、

event_base_loop(my_base, EVLOOP_NO_EXIT_ON_EMPTY);

呼び出しはすぐに返されますが、これは私がすべきことではないと思います。

イベントを追加すると、その保留中のイベントがアクティブになるまでループしますが、ループは発生しないことを望んでいました。

ゴール:

名前付きパイプを開いて、読み取りをリッスンする libevent を用意します。いつでも私は

echo "something" > pipe

登録されたコールバックを呼び出す必要があります。コールバックが終了すると、イベントは保留に戻り、ループは別のエコーを待ちます。

これが私がこれまでに得たものです:(エラーチェックは省略)

#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <event.h>
#include <unistd.h>

#define PIPE "/tmp/ev_pipe"


void cb_func(evutil_socket_t fd, short what, void *arg)
{
  printf("foo\n");
}

int main(void)
{
  /* create & open named pipe */
  mkfifo(PIPE, 0666);
  int socket = open(PIPE, O_RDONLY | O_NONBLOCK);

  /* libevent specific stuff */
  struct event_base *ev_base = event_base_new();
  struct event *ev = event_new(ev_base, (evutil_socket_t) socket, EV_READ, cb_func, NULL);
  event_add(ev, NULL);

  /* loop forever */
  event_base_loop(ev_base, EVLOOP_NO_EXIT_ON_EMPTY);

  printf("a\n");

  /* clean up */
  unlink(PIPE);
  event_base_free(ev_base);
  close(socket);

  return 0;
}

私は何が欠けていますか?イベントループは、キューへの最初の書き込み後に終了します:/

助けてくれてありがとう!

4

2 に答える 2

1

機能の実装にバグがあるようです! 2.1.x バージョンでも同じ問題に直面していました。この問題を回避する 1 つの方法は、@Wizzard が指摘したとおりです。この問題を回避する別の方法は、フラグ EV_PERSIST を関数 event_new のイベント引数に追加することです。

struct event *ev = event_new(ev_base, 
    (evutil_socket_t) socket, EV_READ|EV_PERSIST, cb_func, NULL);

これにより、イベントが削除されなくなります。https://github.com/libevent/libevent/blob/master/include/event2/event.h +872

パイプにデータがある場合、複数のコールバックを受け取る可能性があることに注意してください。

于 2013-11-07T18:38:48.973 に答える
0

event_base_loopbreak ()``` 関数event_base_dispatch (ev_base);の代わりに使用するだけです。event_base_loop ()``, it will loop and handle all attached events either until you explicitly delete all attached events or call

于 2013-11-07T01:45:26.287 に答える