名前付きパイプブロックに書き込むかどうかはどうすればわかりますか?

名前付きパイプブロックに書き込むかどうかはどうすればわかりますか?

すでにリーダーがある場合にのみ名前付きパイプに書きたいです。現在timeoutパイプへの書き込み試行がブロックされているかどうかを検出するために使用している方法は次のとおりです。

#! /usr/bin/env bash
rm -f pipe
mkfifo pipe
sleep 5

timeout 1 bash -c "echo Hello > pipe"

if [[ $? == 0 ]]
then
    echo Somebody got our message
else
    echo Nobody read from pipe, so we didn\'t send a message
fi

これはうまくいきます。睡眠中に別の端末を使用するとtail -f pipeメッセージを受信し、そうでない場合は別のメッセージを受信します。しかし、もっと良い方法がありますか?理想的にはタイムアウトに依存しないものでなければなりません。

ベストアンサー1

パイプに書き込む場合は、一部のプロセスが読み取り用にパイプを開く場合にのみ書き込み用に非ブロックモードで開くことができます。

GNUの使用dd:

echo Hello | dd oflag=nonblock of=pipe status=none &&
  echo message has been sent

ENXIOからエラーメッセージが表示されます。対応するデバイスまたはアドレスがありません。英語)読者がいない場合。

また失敗します(EWOULDBLOCK/使用EAGAINリソースは一時的に使用できません。)パイプがいっぱいの場合(リーダーがありますが、現在読んでいない64KiBのようなものを書いた場合)

また、そうでない場合は、すべてのメッセージを作成できないことにも注意してください。削除された場合、status=noneどのくらい記録されたかを確認できます。

おすすめ記事