Es ist die Launen der Planung.
Ihr Hersteller - nennen wir es alphabeta
- kann für eine gewisse Zeit laufen, bevor head
lesen und beenden kann (wodurch die Leitung unterbrochen wird).
Das "einige Zeit" ist natürlich variabel.
Manchmal alphabeta
läuft 20 mal vor head
kann stdin lesen und beenden. Manchmal 200 mal. Auf meinem System manchmal 300 oder 1000 oder 2000 mal. In der Tat kann es theoretisch bis zu der Kapazität des Rohres reichen, das den Erzeuger und den Verbraucher verbindet.
Zur Demonstration, lassen Sie sich eine gewisse Verzögerung einführen, so dass wir einigermaßen sicher sein können, dass head
in einem Lese stecken() vor alphabeta
eine einzige Zeile Ausgabe erzeugt:
so$ { sleep 5; ./alphabeta; } | head -n 1
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Iteration 0 done
(NB ist es nicht garantiert, dass alphabeta
wird Nur einmal in obigem iterieren, aber auf einem entladenen System, dies wird mehr oder weniger immer der Fall sein: head
wird bereit sein, und sein Lesen/Beenden wird mehr oder weniger sofort geschehen.)
Uhr statt, was passiert, wenn wir künstlich head
verzögern:
so$ ./alphabeta | { sleep 2; head -n 1; }
Iteration 0 done
...
Iteration 2415 done # <--- My system *pauses* here as pipe capacity is reached ...
Iteration 2416 done # <--- ... then it resumes as head completes its first read()
...
Iteration 2717 done # <--- pipe capacity reached again; head didn't drain the pipe
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Als beiseite, @R .. ist ganz richtig in seinen Ausführungen, dass SIGPIPE synchron ist. In Ihrem Fall wird das erste fflush-induzierte Schreiben in eine unterbrochene Leitung (nachdem head
beendet wurde) synchron das Signal erzeugen. Dies ist documented behavior.
Ehm, ** 'const' **' char * s = ... ' –
Es braucht Zeit, um den Tabak stopfen. – Kaz