Dies ist eigentlich ein Fehler [a] in bash
, und es geschieht nicht nur auf SIGWINCH
, sondern auch auf jedem Signal , für das eine Falle gestellt wurde:
{ pid=$BASHPID; trap : USR1; (sleep 1; kill -USR1 $pid) &
printf %0100000d 1; } | sleep 3600
bash: printf: write error: Interrupted system call
Dies liegt daran bash
, dass entweder a) die Signalhandler nicht mit SA_RESTART
(mit Ausnahme des SIGCHLD
Handlers) gesetzt werden oder b) EINTR
beim Aufrufen von write () in den printf
und echo
builtins behandelt wird.
EINTR
("Unterbrochener Systemaufruf") ist keine Möglichkeit, einen Fehlerzustand anzuzeigen, sondern ein Hack, mit dem der Programmierer blockierende Lese- / Schreibvorgänge / usw. mit der Verarbeitung von Signalen in der Hauptschleife kombinieren kann. Es sollte niemals an den Benutzer weitergegeben werden.
Dieser Fehler tritt nicht allzu häufig auf, da es eine ziemliche Leistung ist, die richtigen Bedingungen zu schaffen: write () sollte von einem eingebauten (nicht von einem externen Befehl) ausgeführt werden, es sollte den Pipe-Puffer (den Reader) füllen am anderen Ende sollte es viel langsamer sein oder überhaupt nicht aus der Pipe lesen, aber noch am Leben sein ), und das Skript sollte Traps verwenden oder die Größe des Terminalfensters sollte geändert werden.
Und aufgrund verschiedener Implementierungsartefakte betrifft dies nur unterbrochene write () s, nicht read () s oder open () s (wie z. B. das Blocking open () einer Named Pipe / Fifo).
[a] Eine Form davon wurde bereits voreiniger Zeit gemeldet .
seq -w 0 99999999
.}
) korrekt funktioniert. @ GAD3Rkonsole
Fensters verändere. Eine solche Größenänderung ist in meinem Fall fast ausreichend, aber nicht notwendig.| tee result.txt
und bekomme trotzdem den Fehler./bin/echo
in meinem Fall) anstelle vonecho
integrierten Funktionen machen die Funktion immun (oder zumindest weniger anfällig) für dieses Problem.