5

しばらく libevent2 を使用していましたが、通常はネットワーク I/O (ソケットを使用) を処理するために使用していました。現在、さまざまなファイルを読み取る必要があるため、それも使用したいと考えていました。私はこのコードを作成しました:

int file = open(filename, O_RDONLY);
struct event *ev_file_read = event_new(ev_base, file, EV_READ | EV_PERSIST, read_file, NULL);

if(event_add(ev_file_read, NULL))
        error("adding file event");

残念ながら、うまくいきません。イベントを追加しようとすると、次のメッセージが表示されます。

[警告] fd 7 での Epoll ADD(1) が失敗しました。古いイベントは 0 でした。read change は 1 (追加) でした。write change was 0 (なし): 操作は許可されていません adding file イベント: 操作は許可されていません

ファイルが存在し、読み取り/書き込み権限があります。

libevent を使用してファイル IO を処理する方法を知っている人はいますか? bufferred イベントについても考えましたが、API には、ここでは適用されない関数 bufferevent_socket_new() しかありません。

前もって感謝します。

4

3 に答える 3

7

優先度に関する多くのファイルを読み取るには、libevent が必要でした。問題は libevent ではなく epoll にありました。Epoll は通常の Unix ファイルをサポートしていません。

それを解決するために、libevent で epoll を使用しないようにしました。

    struct event_config *cfg = event_config_new();

event_config_avoid_method(cfg, "epoll");

ev_base = event_base_new_with_config(cfg);  
    event_config_free(cfg);

優先リストの次の方法は投票で、私が望んでいたようにファイルを完全にサポートします。

回答ありがとうございました。

于 2011-03-29T11:25:47.213 に答える
2

通常のファイル記述子をに登録しても意味がありませんlibevent通常のファイルに関連付けられたファイル記述子は、読み取り準備完了、書き込み準備完了、およびエラー状態に対して常にtrueを選択する必要があります。

于 2011-03-28T09:57:29.047 に答える
1

非同期ディスク I/O を実行したい場合は、aio_* ファミリーを確認してください (man (3) aio_read を参照)。これは POSIX.1-2001 であり、Linux と BSD で利用できます (少なくとも)。

aio 操作を libevent に統合する方法については、libevent aio patchおよび関連する stackoverflow の投稿を参照してください。この記事では、signalfd(2) を使用して aio シグナル イベントを、さまざまな fd イベント ポーリングの実装で使用できるファイル記述子にルーティングすることが言及されています (libevent ループで暗黙的に)。 .

編集:libeventにはシグナル処理サポートもあります(それを完全に忘れていました)ので、libeventループで/から直接aioシグナルを登録/処理できます。開発ルールで許可されている場合は、個人的に libevent パッチを最初に試してみたいと思います。

于 2011-03-28T09:48:47.567 に答える