Ich habe dieses kleine Testskript:
rm fooo | cat
mkfifo fooo
echo 'bar' > fooo # blocks here
echo 'done'
Ich vermute, dass der Schreibaufruf bis dahin blockiert ist, weil niemand aus der benannten Pipe liest.
Gibt es eine Möglichkeit, auch dann zu schreiben, wenn keine Leser da sind, oder zu prüfen, ob keine Leser da sind?
Antwort1
Entsprechendhttps://man7.org/linux/man-pages/man7/fifo.7.html:
" Unter Linux ist das Öffnen eines FIFO zum Lesen und Schreiben sowohl im blockierenden als auch im nicht blockierenden Modus erfolgreich. POSIX lässt dieses Verhalten undefiniert. Dies kann verwendet werden, um einen FIFO zum Schreiben zu öffnen, während keine Leser verfügbar sind. Ein Prozess, der beide Enden der Verbindung verwendet, um mit sich selbst zu kommunizieren, sollte sehr vorsichtig sein, um Deadlocks zu vermeiden."
Antwort2
Eine Lösung wäre, in derselben Zeile einen Reader hinzuzufügen:
echo "unlocked" > "$fifo" > >(read line; echo "$line")
aber ich kenne die richtige Syntax dafür nicht ... Ich weiß nur, dass ich es zum Lesen öffnen muss, bevor der erste Schreibaufruf blockiert wird. Das oben genannte scheint nicht zu funktionieren.