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;
}
私は何が欠けていますか?イベントループは、キューへの最初の書き込み後に終了します:/
助けてくれてありがとう!