すでにリーダーがある場合にのみ名前付きパイプに書きたいです。現在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
どのくらい記録されたかを確認できます。