ホームページ  >  記事  >  バックエンド開発  >  O_RDONLY を指定した os.OpenFile がライターなしで名前付きパイプでハングする

O_RDONLY を指定した os.OpenFile がライターなしで名前付きパイプでハングする

王林
王林転載
2024-02-11 08:33:081210ブラウズ

带有 O_RDONLY 的 os.OpenFile 挂在没有编写器的命名管道上

php Editor Banana では、os.OpenFile 関数を O_RDONLY とともに使用して、ライターを使用せずに名前付きパイプにマウントする特別な操作方法を紹介します。この操作方法により名前付きパイプの読み込み操作が実現でき、ライターを使わずに名前付きパイプ内のデータ情報を簡単に取得することができます。この手法は理解しやすく、操作も簡単なので、名前付きパイプを扱う開発者にとって優れた選択肢となります。次に、このメソッドを使用して名前付きパイプの読み取り操作を実装する方法を詳しく紹介します。

質問の内容

私は、アドホック cli コマンドから通知を受け取り、unix 名前付きパイプ経由で通知を受け取ることを選択するデーモンを作成しています。一方で、ノードから読み取り、受信した通知をチャネル (単体テストのあるプレイグラウンド) に送信する別の goroutine を生成する短いパッケージを作成しました。 リーリー

これは機能しているように見えますが、

writers がファイルを開く前に readers がファイルを開くことができないという奇妙な動作に悩まされています。動作を逆転させるためにこのトピックについて読んだことがあります。通常の苦情は、リーダーがいないためにライターがハングするというものですが、ここではそもそもリーダーをインスタンス化できません。

解決策

これは

posix システム インターフェイスです :中记录的默认行为>

o_nonblock o_rdonly または o_wronly を設定して FIFO を開く場合: o_nonblock が設定されている場合、読み取り専用の open() は何もせずに戻ります。 遅れ。プロセスが存在しない場合、書き込み専用の open() はエラーを返します。 ファイルは現在読み取りのために開かれています。

o_nonblock がクリアされている場合、読み取り専用の open() はブロックされます。 スレッドが書き込み用にファイルを開くまで呼び出されます。 open() 書き込み専用では、スレッドがオープンされるまで呼び出し元のスレッドをブロックする必要があります。 読み取り用のファイル。

サポートされているブロックスペシャルファイルまたはキャラクタスペシャルファイルを開く場合 ノンブロッキングオープン:

o_nonblock が設定されている場合、open() 関数は何もせずに戻ります。 デバイスが準備完了または使用可能になるのを防ぎます。その後の行動 デバイスのプロパティはデバイス固有です。

o_nonblock がクリアされている場合、open() 関数は呼び出しをブロックします。 l> デバイスの準備が完了するか使用可能になるまで、スレッドは戻りません。

それ以外の場合、o_nonblock フラグはエラーを引き起こしませんが、 ファイルステータスフラグにo_nonblockが含まれるかどうかは指定されていません ロゴ。

したがって、解決策は、

syscall.o_nonblock フラグを openfile 呼び出しに追加することです。 リーリー 編集: コメントで説明したように、このソリューションは

darwin

環境に移植できません。より移植性の高い解決策は、o_rdwr を使用してリーダー側でファイルを開くことです。

以上がO_RDONLY を指定した os.OpenFile がライターなしで名前付きパイプでハングするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。