sigaction(2) System Calls Manual sigaction(2) BEZEICHNUNG sigaction, rt_sigaction - Signalaktionen untersuchen und andern BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include int sigaction(int signum, const struct sigaction *_Nullable restrict akt, struct sigaction *_Nullable restrict altakt); Mit Glibc erforderliche Feature-Test-Makros (siehe feature_test_macros(7)): sigaction(): _POSIX_C_SOURCE siginfo_t: _POSIX_C_SOURCE >= 199309L BESCHREIBUNG Der Systemaufruf sigaction wird zur Veranderung der von einem Prozess beim Empfang eines Signals durchgefuhrten Aktion benutzt. (Siehe signal(7) fur einen Uberblick uber Signale.) signum legt das Signal fest und kann jedes gultige Signal ausser SIGKILL und SIGSTOP sein. Falls akt nicht NULL ist, wird die neue Aktion fur Signal signum aus akt installiert. Falls altakt nicht NULL ist, wird die vorherige Aktion in altakt gespeichert. Die Struktur sigaction wird durch etwas wie das folgende definiert: struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t sa_mask; int sa_flags; void (*sa_restorer)(void); }; Auf einigen Architekturen ist eine Union beteiligt; weisen Sie diese nicht sowohl sa_handler als auch sa_sigaction zu. Das Feld sa_restorer ist nicht zur Verwendung durch Anwendungen gedacht. (POSIX spezifiziert ein Feld sa_restorer nicht.) Weitere Details uber den Zweck dieses Feldes finden Sie in sigreturn(2). sa_handler bestimmt die Aktion, die signum zugeordnet werden soll und kann eine der folgenden sein: o SIG_DFL fur die Standardaktion. o SIG_IGN um dieses Signal zu ignorieren. o Ein Zeiger auf eine Signalhandhabungsfunktion. Diese Funktion empfangt die Signalnummer als sein einziges Argument. Falls SA_SIGINFO in sa_flags festgelegt ist, dann legt sa_sigaction (statt sa_handler) die Signal-Handhabungsfunktion fur signum fest. Diese Funktion empfangt wie unten beschrieben drei Argumente. sa_mask legt eine Signalmaske fest, die angibt, welche Signale wahrend der Ausfuhrung der Signalhandhabungsfunktion blockiert (d.h. zu der Signalmaske des Threads, in der der Signal-Handler aufgerufen wird, hinzugefugt) werden sollen. Zusatzlich wird das Signal, das den Handler ausgelost hat, blockiert, falls nicht der Schalter SA_NODEFER verwandt wurde. sa_flags legt eine Gruppe von Schaltern fest, die das Verhalten des Signals verandern. Es wird durch bitweise ODER-Verknupfung von Null oder mehreren der folgenden Werte erstellt: SA_NOCLDSTOP Falls signum SIGCHLD ist, werden keine Benachrichtigungen empfangen, wenn ein Kindprozess gestoppt (d.h. wenn es SIGSTOP, SIGTSTP, SIGTTIN oder SIGTTOU empfangt) oder wiederaufgenommen wird (d.h. es SIGCONT empfangt) (siehe wait(2)). Dieser Schalter ist nur bei der Einrichtung eines Handlers fur SIGCHLD von Bedeutung. SA_NOCLDWAIT (seit Linux 2.6) Falls signum SIGCHLD ist, Kinder nicht beim Beenden in Zombies umwandeln. Siehe auch waitpid(2). Dieser Schalter ist nur beim Aufbau eines Handlers fur SIGCHLD von Bedeutung oder wenn die Zuordnung dieses Signals zu SIG_DFL gesetzt wird. Falls der Schalter SA_NOCLDWAIT beim Einrichten eines Handlers fur SIGCHLD gesetzt ist, lasst es POSIX.1 unspezifiziert, ob ein Signal SIGCHLD generiert wird, wenn sich ein Kindprozess beendet. Unter Linux wird in diesem Fall ein Signal SIGCHLD generiert, bei einigen anderen Implementierungen passiert das nicht. SA_NODEFER Fugt das Signal nicht zu der Signalmaske des Threads hinzu, wahrend der Handler ausgefuhrt wird, ausser das Signal ist in act.sa_mask festgelegt. Folgerichtig kann eine weitere Instanz des Signals an den Thread ausgeliefert werden, wahrend er den Handler ausfuhrt. Dieser Schalter ist nur beim Aufbau eines Signal-Handlers von Bedeutung. SA_NOMASK ist ein veraltetes, nicht standardisiertes Synonym fur diesen Schalter. SA_ONSTACK Den Signal-Handler auf einen alternativen, durch sigaltstack(2) bereitgestellten Signal-Stack aufrufen. Falls kein alternativer Stack verfugbar ist, wird der Standard-Stack verwandt. Dieser Schalter ist nur beim Aufbau eines Signal-Handlers von Bedeutung. SA_RESETHAND Stellt die Signalaktion beim Eintritt in den Signal-Handler auf den Vorgabewert zuruck. Dieser Schalter ist nur bei der Einrichtung eines Handlers von Bedeutung. SA_ONESHOT ist ein veraltetes, nicht standardisiertes Synonym fur diesen Schalter. SA_RESTART Stellt ein zur BSD-Signalsemantik kompatibles Verhalten her, indem bestimmte Systemaufrufe uber Signale hinweg neu gestartet werden konnen. Dieser Schalter ist nur bei der Einrichtung eines Handlers von Bedeutung. Siehe signal(7) fur eine Diskussion bezuglich des Neustarts von Systemaufrufen. SA_RESTORER Nicht fur die Verwendung von Anwendungen gedacht. Dieser Schalter wird von C-Bibliotheken verwandt, um anzuzeigen, dass das Feld sa_restorer die Adresse eines >>Signaltrampolins<< enthalt. Siehe sigreturn(2) fur weitere Details. SA_SIGINFO (seit Linux 2.2) Der Signal-Handler erwartet drei Argumente, nicht eines. In diesem Fall sollte sa_sigaction auf sa_handler gesetzt werden. Dieser Schalter ist nur bei der Einrichtung eines Handlers von Bedeutung. SA_UNSUPPORTED (seit Linux 5.11) Wird zum dynamischen Testen fur Schalter-Bit-Unterstutzung verwandt. Falls ein Versuch, einen Handler mit diesem gesetzten Schalter zu registrieren erfolgreich ist, wobei dieser Schalter in act->sa_flags zusammen mit anderen Schaltern, die moglicherweise vom Kernel nicht unterstutzt werden, gesetzt ist und ein sofort folgender Aufruf von sigaction(), der die gleiche Signalnummer und mit einem von NULL verschiedenen Argument oldact hat, SA_UNSUPPORTED clear in oldact->sa_flags ergibt, dann kann oldact->sa_flags als Bitmaske verwandt werden, welche der moglicherweise nicht unterstutzten Schalter tatsachlich unterstutzt werden. Siehe den Abschnitt >>Dynamisches Ermitteln fur Schalter-Bit-Unterstutzung<< fur weitere Details. SA_EXPOSE_TAGBITS (seit Linux 5.11) Normalerweise wird beim Ausliefern eines Signals eine architekturabhangige Gruppe von Markierungsbits aus dem Feld si_addr von siginfo_t bereinigt. Falls dieser Schalter gesetzt ist, wird eine architekturabhangige Teilgruppe der Markierungsbits in si_addr erhalten. Programme, die mit Linux-Versionen alter als 5.11 kompatibel sein mussen, mussen SA_UNSUPPORTED zur Ermittlung der Unterstutzung verwenden. Das Argument siginfo_t eines SA_SIGINFO-Handlers Wenn der Schalter SA_SIGINFO in act.sa_flags angegeben wird, wird die Adresse des Signal-Handlers uber das Feld act.sa_sigaction ubergeben. Dieser Handler akzeptiert drei Argumente wie folgt: void handler(int sig, siginfo_t *info, void *ucontext) { ... } Die Bedeutung der drei Argumente im Einzelnen: sig Die Anzahl der Signale, die den Aufruf des Handlers hervorriefen. info Ein Zeiger auf ein siginfo_t. Dies ist eine Struktur, die weitere Informationen, wie unten beschrieben, uber das Signal enthalt. ucontext Dies ist ein Zeiger auf eine Struktur ucontext_t, typenumgewandelt auf void *. Die Struktur, auf die von diesem Feld gezeigt wird, enthalt Signalkontextinformationen, die vom Benutzerraum-Stack durch den Kernel gespeichert wurden; fur Details siehe sigreturn(2). Weitere Informationen uber die Struktur ucontext_t konnen in getcontext(3) und signal(7) gefunden werden. Typischerweise verwendet die Handler-Funktion das dritte Argument nicht. Der Datentyp siginfo_t ist eine Struktur mit den folgenden Feldern: siginfo_t { int si_signo; /* Signalnummer */ int si_errno; /* Ein Errno-Wert */ int si_code; /* Signal-Code */ int si_trapno; /* Ausnahmebehandlungsnummer die das Hardware- gestuzte Signal hervorrief (auf den meisten Architekturen unbenutzt) */ pid_t si_pid; /* Senden der Prozesskennung */ uid_t si_uid; /* Echte Benutzerkennung des sendenden Prozesses */ int si_status; /* Exit-Wert oder -Signal */ clock_t si_utime; /* Verbrauchte Benutzerzeit */ clock_t si_stime; /* Verbrauchte Systemzeit */ union sigval si_value; /* Signalwert */ int si_int; /* POSIX.1b-Signal */ void *si_ptr; /* POSIX.1b-Signal */ int si_overrun; /* Timer-Uberlaufzahler; POSIX.1b-Timer */ int si_timerid; /* Timer-Kennung; POSIX.1b-Timer */ void *si_addr; /* Speicherort, der die Ausnahmebehnadlung ausloste */ long si_band; /* Bandeereignis (war int in Glibc 2.3.2 und alter) */ int si_fd; /* Dateideskriptor */ short si_addr_lsb; /* Niedrigstes Bit der Adresse (seit Linux 2.6.32) */ void *si_lower; /* Untere Grenze bei Adresssverletzung aufgetreten (seit Linux 3.19) */ void *si_upper; /* Obere Grenze bei Adresssverletzung aufgetreten (seit Linux 3.19) */ int si_pkey; /* Schutzschlussel auf PTE der die Ausnahmebehandlung ausloste (seit Linux 4.6) */ void *si_call_addr; /* Adresse der Systemaufrufanweisung (seit Linux 3.5) */ int si_syscall; /* Nummer des versuchten Systemaufrufs (seit Linux 3.5) */ unsigned int si_arch; /* Architektur des versuchten Systemaufrufs (seit Linux 3.5) */ } si_signo, si_errno und si_code sind fur alle Signale definiert. (si_errno ist im Allgemeinen unter Linux unbenutzt). Der Rest der Struktur kann eine Union sein, daher sollten nur die Felder ausgelesen werden, die fur das ubergebene Signal von Bedeutung sind: o Signale, die mit kill(2) und sigqueue(3) gesandt werden, fullen si_pid und si_uid aus. Zusatzlich fullen Signale, die mit sigqueue(3) gesandt werden, si_int und si_ptr mit den vom Sender angegebenen Werten aus. Siehe sigqueue(3) fur weitere Details. o Signale, die von POSIX.1b-Timern gesendet werden (seit Linux 2.6), fullen si_overrun und si_timerid. Das Feld si_timerid ist eine interne Kennung, die vom Kernel zur Identifikation des Timers benutzt wurde, sie ist nicht mit der durch timer_create(2) zuruckgelieferten Kennung identisch. Das Feld si_overrun ist der Timer-Uberlaufzahler. Dies ist die gleiche Information, wie sie durch einen Aufruf von timer_getoverrun(2) erhalten wird. Diese Felder sind nicht standardisierte Linux-Erweiterungen. o Signale, die der Nachrichtenbenachrichtigungswarteschlange gesandt werden (siehe die Beschreibung von SIGEV_SIGNAL in mq_notify(3)), fullen si_int/si_ptr, wobei sigev_value fur mq_notify(3) bereitgestellt wird, si_pid mit der Prozesskennung des Absenders und si_uid mit der realen Benutzerkennung des Nachrichtensenders. o SIGCHLD fullt si_pid, si_uid, si_status, si_utime und si_stime mit Informationen uber das Kind aus. Das Feld si_pid ist die Prozesskennung des Kindes; si_uid ist die reale Benutzerkennung. Das Feld si_status enthalt den Exit-Status des Kindes (falls si_code CLD_EXITED ist) oder die Signalnummer, die den Prozess zur Zustandsanderung veranlasst hat. si_utime und si_stime enthalten die vom Kindprozess verwandte Benutzer- und System-CPU-Zeit, diese Felder enthalten nicht die Zeit von Kindern, auf die gewartet wurde (anders als getrusage(2) und times(2)). Bis Linux 2.6 und seit Linux 2.6.27 berichten diese Felder die CPU-Zeit in Einheiten von sysconf(_SC_CLK_TCK). In Linux 2.6er-Kerneln vor Linux 2.6.27 wurden durch einen Fehler diese Felder in Einheiten der (konfigurierbaren) System-Jiffys berichtet (siehe time(7)). o SIGILL, SIGFPE, SIGSEGV, SIGBUS und SIGTRAP fullen in si_addr die Adresse der Ausnahmebehandlung ein. Auf einigen Architekturen werden diese Signale auch in das Feld si_trapno eingefullt. Einige Unterfehler von SIGBUS, insbesondere BUS_MCEERR_AO und BUS_MCEERR_AR, fullen auch si_addr_lsb aus. Dieses Feld zeigt die niedrigste Bit der berichteten Adresse and und somit die grosse der Beschadigung. Wurde beispielsweise eine ganze Seite beschadigt, enthalt si_addr_lsb contains log2(sysconf(_SC_PAGESIZE)). Wenn SIGTRAP als Antwort auf ein ptrace(2)-Ereignis (PTRACE_EVENT_foo) geliefert wird, dann wird si_addr nicht gefullt, aber si_pid und si_uid werden mit der respektiven Prozesskennung und Benutzerkennung, die fur das Ausliefern der Ausnahmebehandlung verantwortlich sind, gefullt. Im Falle von seccomp(2) wird das nachverfolgte Programm (>>Tracee<<) als Auslieferer des Ereignisses angezeigt. BUS_MCEERR_* and si_addr_lsb sind Linux-spezifische Erweiterungen. Der Unterfehler SEGV_BNDERR von SIGSEGV belegt si_lower und si_upper. Der Unterfehler SEGV_PKUERR von SIGSEGV belegt si_pkey. o SIGIO/SIGPOLL (die zwei Namen sind unter Linux synonym) fullen si_band und si_fd aus. Das Ereignis si_band ist eine Bitmaske, die die gleichen Werte enthalt, die auch durch poll(2) in das Feld revents eingetragen werden. Das Feld si_fd zeigt den Dateideskriptor an, fur den ein E/A-Ereignis aufgetreten ist. Fur weitere Details lesen Sie die Beschreibung von F_SETSIG in fcntl(2). o SIGSYS, erstellt (seit Linux 3.5) wenn ein Seccomp-Filter SECCOMP_RET_TRAP zuruckliefert, fullt si_call_addr, si_syscall, si_arch, si_errno und andere Felder wie in seccomp(2) beschrieben aus. Das Feld si_code Das Feld si_code innerhalb des an den Signal-Handler SA_SIGINFO ubergebenen Arguments siginfo_t ist ein Wert (keine Bitmaske), der angibt, warum dieses Signal gesendet wurde. Fur ein ptrace(2)-Ereignis wird si_code SIGTRAP enthalten und das Ptrace-Ereignis im hohen Byte enthalten. (SIGTRAP | PTRACE_EVENT_foo << 8). Fur ein Ereignis ausserhalb von ptrace(2) sind die Werte, die in si_code erscheinen konnen, im Rest dieses Abschnittes beschrieben. Seit Glibc 2.20 werden die Definitionen der meisten dieser Symbole aus erhalten, indem Feature-Test-Makros (vor dem Einbinden irgendeiner Header-Datei) wie folgt definiert werden: o _XOPEN_SOURCE mit dem Wert 500 oder grosser; o _XOPEN_SOURCE und _XOPEN_SOURCE_EXTENDED; oder o _POSIX_C_SOURCE mit einem Wert 200809L oder grosser. Fur die Konstanten TRAP_* werden die Symboldefinitionen nur in den ersten zwei Fallen bereitgestellt. Vor Glibc 2.20 wurde kein Feature-Test-Makro zum Erhalt dieser Symbole benotigt. Fur ein regulares Signal zeigt die folgende Liste die Werte, die in si_code fur jedes Signal gelegt werden konnen, zusammen mit dem Grund fur die Erstellung des Signals. SI_USER kill(2) SI_KERNEL Vom Kernel geschickt SI_QUEUE sigqueue(3) SI_TIMER POSIX-Timer ausgelaufen SI_MESGQ (seit Linux 2.6.6) POSIX-Nachrichtenwarteschlangenstatus geandert; siehe mq_notify(3). SI_ASYNCIO AIO abgeschlossen SI_SIGIO SIGIO in die Warteschlange eingereiht (nur bis Linux 2.2; seit Linux 2.4 fullt wie unten beschrieben SIGIO/SIGPOLL in si_code). SI_TKILL (seit Linux 2.4.19) tkill(2) oder tgkill(2) Die folgenden Werte konnen in si_code fur ein Signal SIGILL gesetzt werden: ILL_ILLOPC Ungultiger Opcode ILL_ILLOPN Ungultiger Operand ILL_ILLADR Ungultiger Adressierungsmodus ILL_ILLTRP Ungultige Ausnahmebehandlung. ILL_PRVOPC Privilegierter Opcode ILL_PRVREG Privilegiertes Register ILL_COPROC Koprozessorfehler ILL_BADSTK Interner Stack-Fehler Die folgenden Werte konnen in si_code fur ein Signal SIGFPE gesetzt werden: FPE_INTDIV Ganzzahldivision durch Null FPE_INTOVF Ganzzahluberlauf FPE_FLTDIV Fliesskommadivision durch Null FPE_FLTOVF Fliesskommazahluberlauf FPE_FLTUND Fliesskommazahlunterlauf FPE_FLTRES Ungenaues Fliesskommaergebnis FPE_FLTINV Ungultige Fliesskommazahlaktion FPE_FLTSUB Index ausserhalb des Bereichs Die folgenden Werte konnen in si_code fur ein Signal SIGSEGV gesetzt werden: SEGV_MAPERR Adresse ist keinem Objekt zugeordnet. SEGV_ACCERR Ungultige Berechtigungen fur zugeordnetes Objekt. SEGV_BNDERR (seit Linux 3.19) Adressgrenzenprufung fehlgeschlagen SEGV_PKUERR (seit Linux 4.6) Zugriff wurde durch Speicherschutzschlussel verweigert. Siehe pkeys(7). Der auf diesen Zugriff passende Schutzschlussel ist in si_pkey verfugbar. Die folgenden Werte konnen in si_code fur ein Signal SIGBUS gesetzt werden: BUS_ADRALN Ungultige Adressausrichtung. BUS_ADRERR Nichtexistierende physische Adresse. BUS_OBJERR Objektspezifischer Hardwarefehler. BUS_MCEERR_AR (seit Linux 2.6.32) Hardware-Speicherfehler wurde in einem Maschinen-Check verarbeitet; Aktion notwendig. BUS_MCEERR_AO (seit Linux 2.6.32) Hardwarespeicherfehler im Prozess erkannt aber nicht verwendet; Aktion optional. Die folgenden Werte konnen in si_code fur ein Signal SIGTRAP gesetzt werden: TRAP_BRKPT Prozess-Unterbrechungspunkt TRAP_TRACE Prozessnachverfolgungsausnahmebehandlung. TRAP_BRANCH (seit Linux 2.4, nur IA64) Prozess hat die Ausnahmebehandlung des Zweiges genommen. TRAP_HWBKPT (seit Linux 2.4, nur IA64) Hardware-Unterbrechungs-/Uberwachungspunkt. Die folgenden Werte konnen in si_code fur ein Signal SIGCHLD gesetzt werden: CLD_EXITED Kind hat sich beendet. CLD_KILLED Kind wurde getotet CLD_DUMPED Kind wurde anormal beendet. CLD_TRAPPED Das nachverfolgte Kind kam in eine Ausnahmebehandlung. CLD_STOPPED Kind wurde gestoppt. CLD_CONTINUED (seit Linux 2.6.9) Gestopptes Kind hat fortgefahren. Die folgenden Werte konnen in si_code fur ein Signal SIGIOSIGPOLL gesetzt werden: POLL_IN Dateneingabe verfugbar POLL_OUT Ausgabepuffer verfugbar POLL_MSG Eingabenachricht verfugbar POLL_ERR E/A-Fehler (engl. I/O). POLL_PRI Eingabe hoher Prioritat verfugbar POLL_HUP Gerat abgetrennt Die folgenden Werte konnen in si_code fur ein Signal SIGSYS gesetzt werden: SYS_SECCOMP (seit Linux 3.5) Ausgelost durch eine seccomp(2)-Filterregel. Dynamisches Ermitteln fur Schalter-Bit-Unterstutzung Unter Linux akzeptiert der Aufruf sigaction() ohne Fehler unbekannte Bits, die in act->sa_flags gesetzt sind. Beginnend mit Linux 5.11 ist das Verhalten, dass ein zweiter Aufruf von sigaction() unbekannte Bits aus oldact->sa_flags bereinigen wird. Allerdings wurde historisch ein zweiter Aufruf von sigaction() diese Bits in oldact->sa_flags gesetzt lassen. Das bedeutet, dass die Unterstutzung fur neue Schalter nicht einfach dadurch erkannt werden kann, indem auf einen Schalter in sa_flags getestet wird und ein Programm muss testen, dass SA_UNSUPPORTED bereinigt wurde, beovr es sich auf die Inhalte von sa_flags verlassen kann. Da das Verhalten des Signal-Handlers nicht garantiert werden kann, ausser diese Prufung war erfolgreich, ist es Weise, entweder das betroffene Signal zu blockieren, wahrend der Handler registriert wird und in diesem Fall die Prufung durchzufuhren, oder, wo das nicht moglich ist, beispielsweise falls das Signal synchron ist, einen zweiten sigaction() im Signal-Handler selbst auszulosen. Bei Kerneln, die einen bestimmten Schalter nicht unterstutzen, verhalt sich der Kernel so, als ob der Schalter nicht gesetzt worden ware, selbst wenn der Schalter in act->sa_flags gesetzt wurde. Die Schalter SA_NOCLDSTOP, SA_NOCLDWAIT, SA_SIGINFO, SA_ONSTACK, SA_RESTART, SA_NODEFER, SA_RESETHAND und, falls durch die Architektur definiert, SA_RESTORER konnen nicht zuverlassig mittels dieses Mechanismus erkannt werden, da sie vor Linux 5.11 eingefuhrt wurden. Allerdings konnen Programme im Allgemeinen annehmen, dass diese Schalter unterstuzt werden, da sie alle seit Linux 2.6, das im Jahr 2003 veroffentlicht wurde, unterstutzt werden. Siehe nachfolgende BEISPIELE fur eine Vorstellung des Einsatzes von SA_UNSUPPORTED. RUCKGABEWERT sigaction() gibt bei Erfolg Null zuruck. Bei einem Fehler wird -1 zuruckgegeben und errno entsprechend gesetzt. FEHLER EFAULT akt oder altakt zeigt aus dem vom Prozess adressierbaren Adressraum heraus. EINVAL Ein ungultiges Signal wurde angegeben. Dieser Fehler wird auch ausgelost, wenn versucht wird, die Aktion fur SIGKILL oder SIGSTOP zu andern, da diese nicht abgefangen oder ignoriert werden konnen. VERSIONEN Unterschiede C-Bibliothek/Kernel Die Glibc-Wrapper-Funktion fur sigaction() liefert bei Versuchen, die Zuordnung der zwei intern durch die NPTL-Threading-Implementierung verwandten Echtzeitsignale zu andern, einen Fehler zuruck. Siehe nptl(7) fur Details. Auf Architekturen, bei denen das Signal-Trampolin innerhalb der C-Bibliothek liegt, setzt die Glibc-Wrapper-Funktion fur sigaction() die Adresse des Trampolin-Codes in das Feld act.sa_restorer und SA_RESTORER in das Feld act.sa_flags. Siehe sigreturn(2). Der ursprungliche Linux-Systemaufruf hiess sigaction(). Mit dem Hinzufugen von Echtzeitsignalen in Linux 2.2 passte der mit einer festen Grosse versehene 32-Bit-Typ sigset_t nicht mehr fur den Zweck. Daher wurde ein neuer Systemaufruf rt_sigaction() mit einem vergrosserten Typ sigset_t hinzugefugt. Der neue Systemaufruf akzeptiert ein viertes Argument size_t sigsetsize, das die Grosse in Bytes der Signalgruppe in act.sa_mask und oldact.sa_mask festlegt. Dieses Argument muss derzeit den Wert sizeof(sigset_t) enthalten oder der Fehler EINVAL tritt auf. Die Glibc-Wrapper-Funktion sigaction() versteckt diese Details und ruft rt_sigaction() transparent auf, wenn der Kernel ihn bereitstellt. STANDARDS POSIX.1-2008. GESCHICHTE POSIX.1-2001, SVr4. POSIX.1-1990 verbot das Setzen der Aktion fur SIGCHLD bis SIG_IGN. POSIX.1-2001 und neuer erlauben diese Moglichkeit, so dass das Ignorieren von SIGCHLD zur Vermeidung von Zombies verwandt werden kann (siehe wait(2)). Allerdings unterscheiden sich die historischen BSD- und System-V-Verhalten fur das Ignorieren von SIGCHLD, so dass die einzige komplett portable Methode, um sicherzustellen, dass beendete Kinder nicht Zombies werden, das Fangen des Signals SIGCHLD und das Durchfuhren eines wait(2) oder ahnlichem ist. POSIX.1-1990 spezifizierte nur SA_NOCLDSTOP. POSIX.1-2001 fugte SA_NOCLDSTOP, SA_NOCLDWAIT, SA_NODEFER, SA_ONSTACK, SA_RESETHAND, SA_RESTART und SA_SIGINFO hinzu. Benutzung letzterer Werte in sa_flags konnte in Anwendungen, die fur altere UNIX-Implementierungen gedacht sind, weniger portabel sein. Der Schalter SA_RESETHAND ist zu dem SVr4-Schalter mit dem gleichen Namen kompatibel. Der Schalter SA_NODEFER ist mit dem SVr4-Schalter des gleichen Namens unter Kerneln 1.3.9 und neuer kompatibel. Unter alteren Kerneln erlaubte die Linux-Implementierung nicht das Empfangen irgendeines Signals, nicht nur desjenigen, das installiert wurde (was effektiv die Einstellungen sa_mask ausser Kraft setzt). ANMERKUNGEN Ein mittels fork(2) erstellter Kindprozess erbt eine Kopie der Signalzuordnungen seines Elternprozesses. Wahrend eines execve(2) werden die Zuordnungen von verwalteten Signalen auf die Vorgabe zuruckgesetzt; die Zuordnung ignorierter Signale werden unverandert gelassen. Laut POSIX ist das Verhalten eines Prozesses undefiniert, nachdem er ein Signal SIGFPE, SIGILL oder SIGSEGV ignoriert hat, das nicht von kill(2) oder raise(3) erstellt wurde. Ganzzahldivision durch Null hat ein undefiniertes Ergebnis. Auf einigen Architekturen wird dies ein Signal SIGFPE hervorrufen. (Auch kann die Division der grossten negativen Ganzzahl durch -1 SIGFPE hervorrufen.) Wird dieses Signal ignoriert, kann eine Endlosschleife auftreten. Wird sigaction mit NULL als zweitem Argument aufgerufen, kann der augenblickliche Signal-Handler abgefragt werden. Die Funktion kann auch dazu benutzt werden, die Gultigkeit eines Signales fur die aktuelle Maschine zu uberprufen, indem sie mit NULL als zweitem und drittem Argument aufgerufen wird. Es ist nicht moglich, SIGKILL oder SIGSTOP zu blockieren (indem sie in sa_mask festgelegt werden). Derartige Versuche werden ohne Ruckmeldung ignoriert. Siehe sigsetops(3) fur Details uber das Bearbeiten von Signalgruppen. Siehe signal-safety(7) fur eine Liste der asynchron-signalsicheren Funktionen, die sicher innerhalb eines Signal-Handlers aufgerufen werden konnen. Undokumentiert Vor der Einfuhrung von SA_SIGINFO war es auch moglich, einige zusatzliche Informationen uber das Signal zu erhalten. Dies erfolgte durch Bereitstellung eines sa_handler-Signal-Handlers mit einem zweiten Argument des Typs struct sigcontext, das die gleiche Struktur ist, wie jene, die im Feld uc_mcontext der Struktur ucontext ubergeben wird, die wiederum (mittels eines Zeigers) als drittes Argument des Handlers sa_sigaction ubergeben wird. Siehe die relevanten Kernelquellen fur Details. Diese Verwendung ist jetzt veraltet. FEHLER Wird ein Signal mit einem SA_SIGINFO-Handler ausgeliefert, stellt der Kernel nicht immer aussagekraftige Werte fur alle Felder von siginfo_t, die relevant fur dieses Signal sind, bereit. In Linux bis einschliesslich 2.6.13 verhinderte die Festlegung von SA_NODEFER in sa_flags nicht nur die Ausblendung des ausgelieferten Signals wahrend der Ausfuhrung des Handlers sondern auch der in sa_mask festgelegten Signale. Dieser Fehler wurde in Linux 2.6.14 behoben. BEISPIELE Siehe mprotect(2) Ermitteln von Schalter-Unterstutzung Das nachfolgende Beispielprogramm beendet sich mit dem Status EXIT_SUCCESS falls bestimmt wird, dass SA_EXPOSE_TAGBITS unterstutzt wird, und andernfalls mit EXIT_FAILURE. #include #include #include #include void handler(int signo, siginfo_t *info, void *context) { struct sigaction oldact; if (sigaction(SIGSEGV, NULL, &oldact) == -1 || (oldact.sa_flags & SA_UNSUPPORTED) || !(oldact.sa_flags & SA_EXPOSE_TAGBITS)) { _exit(EXIT_FAILURE); } _exit(EXIT_SUCCESS); } int main(void) { struct sigaction act = { 0 }; act.sa_flags = SA_SIGINFO | SA_UNSUPPORTED | SA_EXPOSE_TAGBITS; act.sa_sigaction = &handler; if (sigaction(SIGSEGV, &act, NULL) == -1) { perror("sigaction"); exit(EXIT_FAILURE); } raise(SIGSEGV); } SIEHE AUCH kill(1), kill(2), pause(2), pidfd_send_signal(2), restart_syscall(2), seccomp(2), sigaltstack(2), signal(2), signalfd(2), sigpending(2), sigprocmask(2), sigreturn(2), sigsuspend(2), wait(2), killpg(3), raise(3), siginterrupt(3), sigqueue(3), sigsetops(3), sigvec(3), core(5), signal(7) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Rene Tschirley , Martin Eberhard Schauer und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 sigaction(2)