既存の名前付きパイプの上書きを防ぐ

既存の名前付きパイプの上書きを防ぐ

私は次のコマンドを持っています:

ql_receiver_lock_holder > "${my_named_pipe}"

名前付きパイプがすでに存在する場合はそれを上書きしますか?上書きを避ける最善の方法は、単に使用することです。

ql_receiver_lock_holder >> "${my_named_pipe}"

答え1

名前付きパイプにリダイレクトすると、パイプは削除されず、パイプを介してデータが渡されるか、パイプから読み取られたものがない場合はブロックされます。

これは名前付きパイプを使用する一般的な方法です。これを作成してからデータを送信します。

答え2

>open()in modeO_WRONLY|O_TRUNKではなく>>mode で実行しますが、名前付きパイプの場合は違いはありません。open()O_WRONLY|O_APPEND

考慮すべき3つの状況があります。

  1. まだ読むためにfifoファイルを開いたプロセスはありません。その後、open()(コマンドが実行される前にシェルによって実行されます)、一部のプロセスが読み取り用にファイルを開くまでブロックされます。
  2. 一部のプロセスは読み取り用にfifoファイルを開きましたが、まだ書き込み用に開いていません。これでopen()成功し、パイプをインスタンス化します。これにより、コマンドがすぐに開始され、パイプがいっぱいになるか、一部のプロセスが他端の内容を読み取るまで、データが蓄積されたパイプに書き込むことができます。
  3. パイプはすでにインスタンス化されています(fifoファイルが読み取りおよび書き込み用に開かれているため)。これにより、fdはopen()同じパイプに返されます(新しいパイプをインスタンス化する代わりに)。これは、私たちのコマンドで書かれた書き込みがパイプに書き込む他のコマンド書き込みとインターリーブされることを意味します。書き込みは、この値PIPE_BUF(Linuxでは4KiB)より小さい場合にのみ原子性が保証されます。これは生成された通常のパイプラインと変わりません。pipe()

他のオープンモードはO_RDWR(読み取り+書き込み)です。シェルでは、<>演算子(1<>stdoutリダイレクト、それ以外の場合はfd 0(stdin)で開きます)を使用してこれを達成できます。多くのシステムでは、条件によると絶対にブロックされません。パイプをインスタンス化します。まだインスタンス化されていません。

関連情報