Warum führt SIGUSR1 zum Abbruch des Prozesses?

20

Ich war mit diesem Kommentar in anderer Frage überrascht :

Wenn Sie dd das USR1-Signal zu früh nach dem Start senden (dh in einem Bash-Skript die Zeile, nachdem Sie es gestartet haben), wird es tatsächlich beendet

Kann jemand erklären, warum ?

Alois Mahdal
quelle
Nicht so sehr eine Antwort auf Ihre Frage, aber versuchen Sie es mit diesem Einzeiler: { dd if=/dev/zero of=/dev/null & }; kill -USR1 $!; jobs; sleep 1; jobsum den Effekt zu reproduzieren, den Sie beschreiben.
Jippie

Antworten:

38

Jedes Signal hat eine "Standarddisposition" - was ein Prozess standardmäßig tut, wenn er dieses Signal empfängt. Es gibt eine Tabelle in der signal(7)Manpage, in der sie aufgelistet sind:

Signal     Value     Action   Comment
──────────────────────────────────────────────────────────────────────
...
SIGUSR1   30,10,16    Term    User-defined signal 1
SIGUSR2   31,12,17    Term    User-defined signal 2

SIGUSR1und SIGUSR2beide haben die Standardaktion Term- der Prozess wird beendet. ddRegistriert einen Handler, um das Signal abzufangen und etwas Nützliches zu tun. Wenn Sie jedoch zu schnell signalisieren, hatte er noch keine Zeit, diesen Handler zu registrieren, sodass stattdessen die Standardaktion ausgeführt wird

Michael Mrozek
quelle
1
Ich wünschte, ich könnte zweimal dafür stimmen, dass ich auf diese Dunkelheit aufmerksam gemacht wurde. Das zufällige Absterben von Prozessen nach dem Entfernen eines expliziten Signal-Handlers war beunruhigend.
DeaconDesperado
1
Gibt es eine praktische Möglichkeit, diesen Rennzustand zu kontrollieren, anstatt nur eine angemessene Zeit lang zu schlafen (~ 0,5-1 Sek.)? (Ich meine, neben etwas Lächerlichem wie das Erfassen und Analysieren von straceAusgaben in einem Shell-Skript…)
Adrian Günter
Ich hatte ein Shell-Skript, das gut funktionierte. Aber plötzlich aufhören zu arbeiten wegen wahrscheinlich !: Ich hatte Hyperthreding jetzt ab. Der Subprozess, der kill -s SIGUSR1 $ PARENT_PID sendet, wird jetzt zu schnell. Das übergeordnete Element glaubt, dass das übergeordnete Element normal terminiert ist, aber das übergeordnete Element führt die Schleife weiterhin aus. Dies ist ein guter Beitrag. Ich habe den größten Teil des Tages damit verbracht, dies herauszufinden.
Kemin Zhou