Linux のパイプに関する多くの質問と回答を見つけましたが、ほとんどすべてがリーダー側について議論しています。
データが利用可能になり、読み取りプロセスが接続されるとすぐに名前付きパイプにデータを配信する準備ができているプロセスの場合、非ブロッキング方式で次の方法があります。
- リーダーがパイプを開くのを待ち (poll(2))、
- パイプへの書き込みがブロックされないというシグナルをループ (再び poll(2)) で待機し、
- そのようなシグナルが受信されたら、ブロックせずにパイプに書き込むことができるバイト数を確認します
(2.) のやり方は理解できましたが、(1.) と (3.) について一貫した答えを見つけることができませんでした。
編集:パイプ用の(のような)FIONWRITEを探していましたが、Linuxには(パイプ用の)FIONWRITEがありません(?)
EDIT2: ライターの意図したメイン ループ (一種の疑似コード、ターゲット言語は C/C++):
forever
poll(can_read_command, can_write_to_the_fifo)
if (can_read_command) {
read and parse command
update internal status
continue
}
if (can_write_to_the_fifo) {
length = min(data_available, space_for_nonblocking_write)
write(output_fifo, buffer, length)
update internal status
continue
}