使用例は、1 つのアプリケーションがイベントを生成し、リッスンするアプリケーションが取得するシグナルを送信することです。たとえば、アプリケーションはファイルの内容を更新し、これを通知します。Linux では、ウェイターがファイルに対して inotify を呼び出すことでこれを行うことができます。可搬性のある方法の 1 つは、リスナーがよく知られているサーバーに登録することですが、可能であれば、もっと単純なものを希望します。理想的には、可能な限り移植性があるということは、広く利用可能な POSIX 機能のみを使用することを意味します。
2 に答える
1
ロックファイルを使用するオプション
これを行うには、ファイルをロックします。
シグナルエミッタの初期設定:
- 既知の名前でファイルを作成し、書き込み用にロックします (
fcntl(F_SETLK)
withF_WRLCK
または flock(LOCK_EX)`)。
信号受信手順:
- よく知られているファイル名を使用してファイルを開き、読み取りロックの取得を試みます (または
fcntl(F_SETLK)
を使用)。F_RDLCK
flock(LOCK_SH)
- エミッターが競合する書き込みロックを保持しているため、レシーバーがブロックされます。
信号放出:
- シグナルエミッターは新しい一時ファイルを作成します
- シグナルエミッターは新しい一時ファイルの書き込みロックを取得します
- シグナル エミッターは、新しい一時ファイルの名前を既知のファイル名に変更します。これにより、古いロック ファイルが上書きされますが、待機中の受信者はすべてそれへの参照を保持します。
- シグナルエミッターは古いロックファイルを閉じます。これにより、ロックも解除されます。
- 読み取りロックを取得できるようになったため、シグナル受信者はすべてウェイクアップします。
- シグナル受信者は、ロックを取得したばかりのファイルを閉じる必要があります。再び使用されることはありません。状態が再び発生するのを待ちたい場合は、ファイルを再度開く必要があります。
シグナル エミッターでは、元のロック ファイルの上に名前が変更された一時的なロック ファイルが、新しい現在のロック ファイルになります。
ネットワーク マルチキャストを使用するオプション
受信者をマルチキャスト グループに参加させ、パケットを待機させます。シグナル エミッターに UDP パケットをそのマルチキャスト グループに送信させます。
ホストローカル通信のみを使用する場合は、送信 UDP ソケットと受信 UDP ソケットの両方をループバック インターフェイスにバインドできます。
于 2012-01-05T11:32:05.687 に答える
0
最後に、バインドされた UNIX ドメイン ソケットを使用しました。所有者はクライアント FD の配列を保持し、イベントが発生したときにそれぞれにメッセージを送信します。
于 2014-09-26T14:46:29.623 に答える