私はlibevent2をいじくり回していて、ファイルの読み取りが機能していますが、ブロックされます。libevent内だけでファイルの読み取りをブロックしないようにする方法はありますか?または、ファイルに別のIOライブラリを使用して、必要なイベントをポンプする必要がありますか?
fd = open("/tmp/hello_world",O_RDONLY);
evbuffer_read(buf,fd,4096);
O_NONBLOCKフラグも機能しません。
私はlibevent2をいじくり回していて、ファイルの読み取りが機能していますが、ブロックされます。libevent内だけでファイルの読み取りをブロックしないようにする方法はありますか?または、ファイルに別のIOライブラリを使用して、必要なイベントをポンプする必要がありますか?
fd = open("/tmp/hello_world",O_RDONLY);
evbuffer_read(buf,fd,4096);
O_NONBLOCKフラグも機能しません。
POSIXでは、ディスクは「高速デバイス」と見なされます。つまり、ディスクは常にブロックされます(これが、O_NONBLOCKが機能しなかった理由です)。ネットワークソケットのみが非ブロッキングになります。
POSIX AIOがありますが、たとえばLinuxには多くの制限があり、汎用の使用には適していません(O_DIRECTの場合のみ、I / Oはセクターに合わせて調整する必要があります)。
通常のPOSIXIOを非同期イベントループに統合したい場合、人々はスレッドプールに頼っているようです。そこでは、ブロッキングシステムコールがワーカースレッドの1つによってバックグラウンドで実行されます。そのようなライブラリの一例はlibeioです
いいえ。
より特別なAIOライブラリを使用せずに通常のファイルでノンブロッキングI/Oを実行できる*nixはまだ見ていません(ただし、solarisなどの一部では、他の誰かがロックを保持している場合、O_NONBLOCKが効果を発揮しますファイル)
node.js / io.jsで使用されているlibuvをご覧ください:https ://github.com/libuv/libuv
これは、WindowsからBSD、Mac OS X、そしてもちろんLinuxまで、すべての主要なオペレーティングシステムでうまく機能するため、libeioの優れた代替手段です。I / O完了ポートをサポートしているため、Windowsをターゲットにしている場合は、libeioよりも優れた選択肢になります。
Cコードも非常に読みやすいので、このチュートリアルを強くお勧めします:https ://nikhilm.github.io/uvbook/