POSIX環境でグローバルな信号可能なイベントを実装する良いポータブルな方法は何ですか
質問
使用法のケースは、1つのアプリケーションがイベントを生成し、それを聞くことを気にするアプリケーションが得られるという信号を送信することです。たとえば、アプリケーションはファイルの内容を更新し、これをシグナルにします。 Linuxでは、これはファイル上でInotifyを呼び出すウェイターによって行うことができます。 1つのポータブルな方法は、リスナーがよく知られているサーバーに登録することですが、可能であれば簡単なものを好むでしょう。可能な限りポータブルは、理想的には、広く利用可能なPOSIX機能のみを使用することを意味します。
解決
ロックファイルを使用したオプション
ファイルをロックすることでこれを行うことができます。
信号エミッター初期セットアップ:
- 有名な名前のファイルを作成し、書き込みのためにロックします(
fcntl(F_SETLK)
とF_WRLCK
またはflock(lock_ex) `)。
信号受信手順:
- よく知られているファイル名を使用してファイルを開き、その上に読み取りロックを取得してみてください(
fcntl(F_SETLK)
とF_RDLCK
またflock(LOCK_SH)
). - エミッターが競合する書き込みロックを保持しているため、レシーバーがブロックされます。
信号放出:
- Signal Emitterは新しい一時ファイルを作成します
- 信号エミッターは、新しい一時ファイルに書き込みロックを取得します
- Signal Emitterは、新しい一時ファイルを有名なファイル名に名前を変更します。これは古いロックファイルを巻き起こしますが、待機中のレシーバーはすべてそれへの参照を保持します。
- 信号エミッターは古いロックファイルを閉じます。これにより、ロックが解放されます。
- 信号受信機はすべて目を覚ますので、読み取りロックを取得できるためです。
- 信号受信機は、ロックをオンにしたばかりのファイルを閉じる必要があります。二度と使用されません。条件が再び起こるのを待ちたい場合は、ファイルを再開する必要があります。
信号エミッターでは、元のロックファイルの上に変更された一時的なロックファイルが新しい電流ロックファイルになりました。
ネットワークマルチキャストを使用したオプション
レシーバーにマルチキャストグループに参加して、パケットを待ちます。信号エミッタにUDPパケットをそのマルチキャストグループに送信させます。
ホストローカル通信のみを使用する場合は、送信および受信UDPソケットの両方をループバックインターフェイスにバインドできます。
他のヒント
最終的に、バウンドUnixドメインソケットを使用しました。所有者は、クライアントFDの配列を保持し、イベントがあるときにそれぞれメッセージを送信します。
所属していません StackOverflow