ライターが存在しない場合にリーダーが存在しても問題ないのに、パイプにリーダーが存在しない場合にライターが存在しても問題ないのはなぜですか?
. リーダーは待機することを意図しているため、ライターがなくても大丈夫ですが、ライターはデータの準備ができており、データの準備ができていてもどれだけ待機する必要があるかわかりません。
. ライターのファイル記述子がリーダーによって悪用される可能性があるためですか(方法はわかりません)
ライターが存在しない場合にリーダーが存在しても問題ないのに、パイプにリーダーが存在しない場合にライターが存在しても問題ないのはなぜですか?
. リーダーは待機することを意図しているため、ライターがなくても大丈夫ですが、ライターはデータの準備ができており、データの準備ができていてもどれだけ待機する必要があるかわかりません。
. ライターのファイル記述子がリーダーによって悪用される可能性があるためですか(方法はわかりません)
パイプの特定の実装について話している必要があります。
[Proc 1]
$ mkfifo /tmp/mypipe
$ echo "No Boom Here" > /tmp/mypipe
<process blocks>
[Proc 2, later]
$ cat /tmp/mypipe
No Boom Here
したがって、Unixシステムでは正常に機能し、リーダーやライターがなくてもパイプの読み取りまたは書き込みを行うことができます。ただし、コンパニオンがサインアップするまで、プロセスはブロックされます。
おそらくこれはWindowsのものですか?
余談ですが、Unixの方法は適切な動作です、IMHO。どちらの方法でもブロックする必要があります。
エラー状態が出力によってトリガーされるためです。したがって、ライターがいないリーダーは、何も気にせずにただそこに座っているだけです。リーダーのないライターは、その出力を送信しようとしますが、送信できず、エラーが発生します。
リーダーの場合、読み取るものが何もないため、すぐにブロック (スリープ) します。ライターが開始された場合、リーダーは引き続きスリープ状態になり、害はありません。
ライターの場合、バッファとブロックがいっぱいになります。リーダーが来ない場合は、システム リソースの純粋な浪費になります。
参考までに、上記は経験に基づいた推測です。