FIFOまたは作成者のアクセスをブロックせずにデータのみを削除することは可能ですか?

FIFOまたは作成者のアクセスをブロックせずにデータのみを削除することは可能ですか?

FIFOはリーダーとライターの両方を開く必要があるため、使用上の問題があります。一方が遅れている場合、もう一方はオペレーティングシステム内でブロックされます。

公開メカニズムを実装する必要があります。プログラムはログを投稿し、誰かがリスニングに「関心」すると(たとえば、公開チャンネルを開くと)メッセージを受け取ります。誰も「関心」しないと、メッセージは消えます。問題ありません。 1つ以上のリスナーをサポートしていません。問題ありません。何が使えますか?

ベストアンサー1

UDPをブロードキャストできます。これは送信者セクションに何でもパイプしてください。

socat - UDP-DATAGRAM:127.255.255.255:50011,sourceport=50022,broadcast

受話器この機能により、いつでもパーティーに参加したり、パーティーから出ることができます。

socat - UDP-LISTEN:50011,bind=127.255.255.255,sourceport=50022,reuseaddr

注と説明:

  • UDPはパケットが順番に到着することを保証しません(参照:これ)
  • 5001150022選択したポート番号です。
  • このアドレスは127.255.255.255ループバックインターフェイスを介してブロードキャストする送信者を表し、必要に応じてLAN内でブロードキャストするように調整できます。
  • 繰り返しますが、bind=127.255.255.255他の場所から来る(存在する場合)UDPパケットを心配する必要がないように、受信機はこのインターフェイスに制限する必要があります。
  • 固定する理由は2つありますsourceport
    • 受信者は、異なる(おそらくランダムな)送信元ポートから同じアドレスとポートにブロードキャストしている別の(悪意のある)送信者を「見ない」ことがあります。
    • 何らかの理由で発信者がシャットダウンした後、それを再開することができ、発信者が任意の送信元ポートを使用している場合、既存の受信者は固定されたままになるため、通常は新しい送信側を「見る」ことができません。前のソースポートに移動します。
  • reuseaddr複数の受信機が共存できます。
  • reuseaddr技術的には、複数の送信者を実行できる送信者セクションに追加できます。これにより、受信側でインターリーブされた出力が発生する可能性があるため、お勧めできません。
  • 実行中の送信者は、まったく同じアドレスとポートタプルを使用して他の(悪意のある)送信者をブロックします。ただし、荷送人が終了すると、他の荷送人が代用することができます。ルートアクセス権がある場合は、sourceport以下から選択できます1024。ほとんどのオペレーティングシステムでは、通常のユーザーがこれらのポート(「特権ポート」と呼ばれる)にバインドすることを許可していないため、送信者が死んでいてもユーザーを偽装することはできません。ただし、一般ユーザーが実行しているリスナーは特権ポートをとして使用できますsourceport。ルートのみを受信できるようにするには、別のポート(50011例では)を特権ポートに変更します。

おすすめ記事