
Aushttps://unix.stackexchange.com/a/447032/674
In Bezug auf den Code
SIGINT
gibt es unter der Annahme des Signals folgende drei Optionen:
signal(SIGINT, SIG_IGN);
ignorieren- Die Funktion nicht aufzurufen
signal()
oder sie mit aufzurufensignal(SIGINT, SIG_DFL);
und damit die Standardaktion auszuführen, d.h. den Prozess zu beendensignal(SIGINT, termination_handler);
, wobeitermination_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_IGN
und 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_DFL
Bash.
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 "" INT
das Signal ignoriert INT
und 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_IGN
im ersten Aufruf rt_sigaction()
und des sa_handler=SIG_DFL
im zweiten sieht es so aus, als trap "" INT
würde bash
das Signal tatsächlich ignoriert und trap - INT
auf den Standardhandler zurückgesetzt.