2

使用例は、1 つのアプリケーションがイベントを生成し、リッスンするアプリケーションが取得するシグナルを送信することです。たとえば、アプリケーションはファイルの内容を更新し、これを通知します。Linux では、ウェイターがファイルに対して inotify を呼び出すことでこれを行うことができます。可搬性のある方法の 1 つは、リスナーがよく知られているサーバーに登録することですが、可能であれば、もっと単純なものを希望します。理想的には、可能な限り移植性があるということは、広く利用可能な POSIX 機能のみを使用することを意味します。

4

2 に答える 2

1

ロックファイルを使用するオプション

これを行うには、ファイルをロックします。

シグナルエミッタの初期設定:

  • 既知の名前でファイルを作成し、書き込み用にロックします ( fcntl(F_SETLK)withF_WRLCKまたは flock(LOCK_EX)`)。

信号受信手順:

  • よく知られているファイル名を使用してファイルを開き、読み取りロックの取得を試みます (またはfcntl(F_SETLK)を使用)。F_RDLCKflock(LOCK_SH)
  • エミッターが競合する書き込みロックを保持しているため、レシーバーがブロックされます。

信号放出:

  • シグナルエミッターは新しい一時ファイルを作成します
  • シグナルエミッターは新しい一時ファイルの書き込みロックを取得します
  • シグナル エミッターは、新しい一時ファイルの名前を既知のファイル名に変更します。これにより、古いロック ファイルが上書きされますが、待機中の受信者はすべてそれへの参照を保持します。
  • シグナルエミッターは古いロックファイルを閉じます。これにより、ロックも解除されます。
  • 読み取りロックを取得できるようになったため、シグナル受信者はすべてウェイクアップします。
  • シグナル受信者は、ロックを取得したばかりのファイルを閉じる必要があります。再び使用されることはありません。状態が再び発生するのを待ちたい場合は、ファイルを再度開く必要があります。

シグナル エミッターでは、元のロック ファイルの上に名前が変更された一時的なロック ファイルが、新しい現在のロック ファイルになります。

ネットワーク マルチキャストを使用するオプション

受信者をマルチキャスト グループに参加させ、パケットを待機させます。シグナル エミッターに UDP パケットをそのマルチキャスト グループに送信させます。

ホストローカル通信のみを使用する場合は、送信 UDP ソケットと受信 UDP ソケットの両方をループバック インターフェイスにバインドできます。

于 2012-01-05T11:32:05.687 に答える
0

最後に、バインドされた UNIX ドメイン ソケットを使用しました。所有者はクライアント FD の配列を保持し、イベントが発生したときにそれぞれにメッセージを送信します。

于 2014-09-26T14:46:29.623 に答える