Iamはlibevに基づいたソケットプログラムを作成しようとしています。https://github.com/coolaj86/libev-examples/blob/master/src/unix-echo-server.cに記載されているいくつかの例では、initに基づくコールバックを使用していることに気付きました。例えば、
main() {
......
ev_io_init(&client.io, client_cb, client.fd, EV_READ|EV_WRITE);
ev_io_start(EV_A_ &server.io);
}
static void client_cb (EV_P_ ev_io *w, int revents)
{
if (revents & EV_READ)
{
....
} else if (revents & EV_WRITE) {
......
}
}
私の質問は、予想される動作から来ています。たとえば、EV_READで読んだものはすべて、リンクリストに保存されています。読み取るパケットのフリーフローを取得し続けているとしましょう。EV_WRITEに入る機会はありますか?読んだものをすべて別のソケットに送信する必要があります。では、1回はEV_READで、2回目はEV_WRITEになるのでしょうか。言い換えれば、EV_WRITEはいつブロック解除されますか?または、EV_WRITEが呼び出されるようにEV_READをブロックする必要がありますか?誰かが私がこれを理解するのを手伝ってもらえますか?