Wie können wir in Bash eine Signalfalle als SIG_IGN und SIG_DFL einrichten?

Wie können wir in Bash eine Signalfalle als SIG_IGN und SIG_DFL einrichten?

Aushttps://unix.stackexchange.com/a/447032/674

In Bezug auf den Code SIGINTgibt es unter der Annahme des Signals folgende drei Optionen:

  • signal(SIGINT, SIG_IGN);ignorieren
  • Die Funktion nicht aufzurufen signal()oder sie mit aufzurufen signal(SIGINT, SIG_DFL);und damit die Standardaktion auszuführen, d.h. den Prozess zu beenden
  • signal(SIGINT, termination_handler);, wobei termination_handler()eine Funktion ist, die beim ersten Auftreten des Signals aufgerufen wird.

Wie kann ich in Bash den Handler eines Signals so einrichten SIG_IGN?

trap "" INT

setzt einen leeren Befehl ""als Signalhandler. Aber setzt es den Handler wirklich auf SIG_IGN?

Wenn Bash einen externen Befehl ausführt, setzt es Signal-Traps auf den Standardwert zurück und ignorierte Signale werden weiterhin ignoriert. Daher ist es wichtig zu wissen, wie man einen Signal-Handler in Bash einrichtet SIG_IGNund ob das Setzen eines Signal-Handlers auf den leeren Befehl ""dasselbe ist wie das Setzen auf SIG_IGN.

Ähnliche Frage zum Einrichten einer Signalfalle für SIG_DFLBash.

Danke.

Antwort1

Aus der POSIX-Dokumentation vondas spezielle integrierte Dienstprogrammtrap:

Wenn action ist -, setzt die Shell jede Bedingung auf den Standardwert zurück. Wenn action null ( "") ist, ignoriert die Shell jede angegebene Bedingung, wenn sie eintritt. Andernfalls wird das Argument action von der Shell gelesen und ausgeführt, wenn eine der entsprechenden Bedingungen eintritt.

Dies bedeutet, dass Ihr Skript nach trap "" INTdas Signal ignoriert INTund dass Sie die Falle mit auf die Standardeinstellung zurücksetzen können trap - INT.

Antwort2

Ich habe dieses Skript genommen:

#!/bin/bash
trap "" INT
trap - INT

Und rannte:

$ strace bash script.sh 2>&1 | grep INT

Unter den Ausgaben sehe ich:

read(3, "#!/bin/bash\ntrap \"\" INT\ntrap - I"..., 80) = 35
read(255, "#!/bin/bash\ntrap \"\" INT\ntrap - I"..., 35) = 35
rt_sigaction(SIGINT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, 8) = 0
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f24e88f2030}, 8) = 0

Angesichts des sa_handler=SIG_IGNim ersten Aufruf rt_sigaction()und des sa_handler=SIG_DFLim zweiten sieht es so aus, als trap "" INTwürde bashdas Signal tatsächlich ignoriert und trap - INTauf den Standardhandler zurückgesetzt.

verwandte Informationen