7

私の目的:モニターがプログラムをブロックすることなく、代わりにループの一部を形成する(したがって、順次チェックする)テキストファイルの変更を監視すること。

私の考えでは、iNotify をノンブロッキング モードで実行する方法を見つけるか、iNotfiy をスレッド化してください。

非ブロッキングの方法を試し、次のコマンドを使用して iNotify インスタンスの O_NONBLOCK を無効にしました。

fcntl (fd, F_SETFL, fcntl (fd, F_GETFL) | O_NONBLOCK);

ただし、これを行うと、次のことを試みます。

length = read(fd, buffer, BUF_LEN);

読み取りのために、リソースが一時的に利用できないと私に言い続けます。

私がやりたいことを達成する方法について、誰かが私にいくつかのヒントを教えてもらえますか? このメソッドである必要はありませんが、Web サーバーでテキスト ファイルを編集していて、変更を C++ プログラムに読み込んで変数を更新したいので、この機能が必要です。

前もって感謝します!

4

1 に答える 1

5

EAGAIN(リソースが一時的に使用不可) は、ファイル記述子が非ブロッキング モードに設定されているときに、読み取られているファイル記述子に使用可能なデータがない場合に予想されるエラー ステータスです。ポーリング ループを使用しているため、次の反復で再度読み取りを試みることができます。

または、inotifyファイル記述子に対してシグナル駆動型 I/O 通知を使用することもできます。

Linux 2.6.25 以降、シグナル駆動の I/O 通知がinotifyファイル記述子で利用可能になりました。(フラグF_SETFLの設定について)、 、およびの説明を参照してください。シグナル ハンドラに渡される構造体 ( で説明) には、次のフィールドが設定されています。シグナル番号に設定されます。に設定されています。si_band に設定されます。O_ASYNCF_SETOWNF_SETSIGfcntl(2)siginfo_tsigaction(2)si_fdinotifysi_signosi_codePOLL_INPOLLIN

于 2013-09-03T08:53:49.887 に答える