%E2%80%9C%20auf%2C%20ohne%20weitere%20%C3%84nderungen%20daran%20vorzunehmen%2C%20wie%20%E2%80%9Eexecve()%E2%80%9C%20die%20Signaldispositionen%20behandelt%3F.png)
Im Bash-Handbuch steht
Wenn ein einfacher Befehl ausgeführt werden soll, der keine integrierte oder Shell-Funktion ist, ... werden von der Shell abgefangene Traps zurückgesetzt aufdie vom übergeordneten Element der Shell geerbten Werteund von der Shell ignorierte Traps werden ignoriert
Während eines execve(2) werden die Dispositionen der verarbeiteten Signale zurückgesetzt aufder Standard; die Dispositionen ignorierter Signale bleiben unverändert."
Sind „der Standard“ und „die vom übergeordneten Element der Shell geerbten Werte“ dasselbe?
Ruft Bash auf execve()
, ohne weitere Änderungen an der execve()
Behandlung der Signaldispositionen vorzunehmen?
Danke.
Antwort1
Nein, „der Standard“ und „die vom übergeordneten Shellelement geerbten Werte“ sind nicht dasselbe. Im Fall von execve bezieht sich „der Standard“ auf SIG_DFL
, was die Standardaktion auslöst, die durch angegeben wird .man 7 signal
. Im Fall von Bash bedeutet „die vom übergeordneten Element der Shell geerbten Werte“ genau das, was es sagt; wenn ein solches Signal SIG_IGN
vom übergeordneten Element ignoriert () wurde, wird es auch vom untergeordneten Element ignoriert.
Ein Schlüssel zum Verständnis dessen, was hier vor sich geht, ist das Wort „behandelt“. Es bezieht sich auf eine benutzerdefinierte Signalhandlerfunktion, die sich von oder unterscheidet SIG_DFL
. SIG_IGN
Sie muss von execve zurückgesetzt werden, da der neue Prozess nicht über die Signalhandlerfunktion verfügt, die der alte Prozess verwendet hat.
Beachten Sie, dass neuere Versionen der execve-Manpage die „behandelten“ Signale als „abgefangene“ Signale bezeichnen, um der Terminologie zu entsprechen, die im Rest von Linux verwendet wird. Dies unterscheidet sich weiterhin von Standard- und ignorierten Signalen.
Einfache Version: Wenn entweder Bash oder das übergeordnete Element von Bash ein als markiertes Signal hatte SIG_IGN
, wird es SIG_IGN
auch im neuen Kind vorhanden sein. Andernfalls wird es SIG_DFL
im neuen Kind vorhanden sein. Es kann nie ein Handler im neuen Kind sein, da im neuen Kind kein Handler von Bash oder seinem übergeordneten Element vorhanden sein wird.