2012-02-24 17 views
0

Unixの場合:私はFAMGaminを使っていますが、どちらもクライアント/サーバーファイル監視システムを提供しているようです。私はむしろ、カーネルにいくつかのinodeを監視するように指示するシステムを持っていて、イベントが発生したときに私を戻します。 Inotifyその側で最初に有望に見えた:inotify_init1poll()を引き起こしたIN_NONBLOCKを直接渡しましょう。しかし、私が監視しているファイルについてのニュースを入手したいのであれば、定期的に呼び出さなければならないことを理解しました。今私は少しのアイデアがありません。ファイルを非同期に監視する

ファイルを非同期で監視する方法はありますか?

PS:私はまだWindowsを見ていませんが、私はあまりにもそれについていくつかの回答をしたいです。

+0

'inotify'はまさにあなたが探しているものです。 inotifyファイルの説明を 'poll()'リクエストに含めると、読み込み可能なinotifyイベントがあるときに返されます。いつも 'poll()'と同じように、あなたが尋ねたファイル記述子のどれも準備ができてタイムアウトが切れていない限り、それはブロックされます。それで問題はどこですか? – Celada

+0

よく、 'poll()'呼び出しをブロックしているのは、私が非同期と呼んでいるものと全く同じではありません。 – qdii

+0

inotifyイベントがあるかどうか、イベントの)?あなたのソフトウェアがイベントを待機して動作するように構成されている場合、 'poll()'などと呼ばれる何らかのイベントループを既に持っています。代わりにイベントが来るのを待っている間に他のコードを実行したいのであれば、おそらく別のスレッドでそれを行う必要があります。その場合、メインスレッドはイベントループを使用するか、またはノンブロッキングIOを使用すると、 'inotify'の' read() 'をブロックするスレッドを1つ作ることができます。 – Celada

答えて

0

しかし、おもしろいですが、申し訳ありませんが、非表示になっているかどうかに関わらず、ポーリングやコールの呼び出しをブロッキングに基づいて選択することはできません。

一方、inotify_init1にフラグIN_NONBLOCKを渡すことで、非同期にinotifyを実行できることがわかりました。信号はaioのようにトリガされず、ブロッキングをブロックするreadコールではerrnoが代わりにEWOULDBLOCKに設定されます。

2

Celadaが上記のコメントで言うように、inotifyとpollはこれを行う正しい方法です。

信号は、妥当な非同期プログラミングのメカニズムではなく、経験の浅い人や経験者にとっても信号ハンドラは非常に危険です。そのような目的のために自発的にそれらを使用しません。

代わりに、ポール、セレクト、または同様のシステムコールをプログラムのイベント処理メカニズムのコアとして使用して、イベントループ(全体的な説明についてはhttp://en.wikipedia.org/wiki/Event-driven_programmingを参照)の周りにプログラムを構築する必要があります。

スレッドまたはスレッドとイベントループを使用することもできます。

関連する問題