sigvec(3) (BSD Compatibility Package) sigvec(3)
NAME
sigvec - Signalfunktionen der Software
SYNTAX
/usr/ucb/cc [flag ...] file ... -lucb
#include <signal.h>
int sigvec(sig, vec, ovec)
int sig;
struct sigvec *vec, *ovec;
BESCHREIBUNG
Das System definiert eine Gruppe von Signalen, die an einen Prozeß
gesendet werden können. Das Senden von Signalen gleicht dem Auftreten
eines Interrupts: Ein weiteres Auftreten des Signals wird verhindert,
der aktuelle Kontext des Prozesses wird gesichert und ein neuer Kon-
text erstellt. Ein Prozeß kann eine Bearbeitungsroutine angeben, an
die das Signal gesendet wird, oder er kann angeben, daß ein Signal
blockiert oder ignoriert werden soll. Ferner kann ein Prozeß angeben,
daß eine Standardaktion vom System ausgeführt werden soll, wenn ein
Signal auftritt. Normalerweise werden Routinen zur Signalbearbeitung
im aktuellen Stack des Prozesses ausgeführt. Dies kann auf Routinen-
Basis geändert werden, so daß Signale in einem speziellen Signal-Stack
verarbeitet werden.
Alle Signale haben dieselbe Priorität. Signalroutinen werden mit dem
Signal ausgeführt, das ihren Aufruf blockiert hat, andere Signale kön-
nen aber weiterhin auftreten. Eine globale Signalmaske definiert die
Gruppe der Signale, die momentan nicht an einen Prozeß gesendet werden
können. Die Signalmaske für einen Prozeß wird von der des Vaterprozes-
ses (normalerweise 0) initialisiert. Sie kann geändert werden, wenn
sigblock oder sigsetmask aufgerufen wird, oder wenn ein Signal an den
Prozeß gesendet wird.
Ein Prozeß kann auch eine Gruppe von Flags für ein Signal angeben, die
sich auf die Ausgabe dieses Signals auswirken.
Wenn eine Signalbedingung für einen Prozeß auftritt, wird das Signal
einer Gruppe von Signalen hinzugefügt, die für den Prozeß anstehen.
Wenn das Signal vom Prozeß derzeit nicht blockiert ist, wird es an den
Prozeß gesendet. Wenn ein Signal gesendet wird, wird der aktuelle Sta-
tus des Prozesses gesichert, eine neue Signalmaske erstellt (wie wei-
ter unten beschrieben) und die Signalbearbeitungsroutine aufgerufen.
Der Aufruf der Routine erfolgt in der Art, daß der Prozeß bei normaler
Rückkehr der Routine zur Signalbearbeitung die Ausführung in dem Kon-
text wiederaufnimmt, der vor der Signalausgabe bestand. Will der Pro-
zeß die Ausführung in einem anderen Kontext wiederaufnehmen, muß er
den vorherigen Kontext selbst wiederherstellen.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
sigvec(3) (BSD Compatibility Package) sigvec(3)
Wenn ein Signal an einen Prozeß gesendet wird, wird eine neue Signal-
maske für die Dauer installiert, die die Signalbearbeitungsroutine des
Prozesses zur Ausführung benötigt (oder bis ein Aufruf von sigblock
oder sigsetmask erfolgt). Diese Maske wird erstellt, indem das zu sen-
dende Signal der aktuellen Signalmaske hinzugefügt wird, und der logi-
sche Operator OR in der Signalmaske verwendet wird, die der aufzuru-
fenden Bearbeitungsroutine zugeordnet ist.
Die Aktion, die bei der Signalausgabe erfolgen soll, wird durch eine
sigvec-Struktur angegeben, die aus folgenden Elementen besteht:
void (*svhandler)(); /* signal handler */
int svmask; /* signal mask to apply */
int svflags; /* see signal options */
#define SVONSTACK /* take signal on signal stack */
#define SVINTERRUPT /* do not restart system on signal return */
#define SVRESETHAND /* reset handler to SIGDFL when signal taken */
Wenn das Bit SVONSTACK in den Flags für dieses Signal gesetzt ist,
sendet das System das Signal für den Prozeß an den Signal-Stack, der
durch sigstack angegeben ist, und nicht an den aktuellen Stack.
Wenn vec kein NULL-Zeiger ist, ordnet sigvec dem angegebenen Signal
die durch svhandler angegebene Bearbeitungsroutine, die durch svmask
angegebene Maske und die durch svflags angegebenen Flags zu. Wenn vec
ein NULL-Zeiger ist, ändert sigvec weder die Bearbeitungsroutine noch
die Maske oder die Flags für das angegebene Signal.
Durch die in vec angegebene Maske dürfen die Signale SIGKILL, SIGSTOP
oder SIGCONT nicht blockiert werden. Das System sorgt stillschweigend
für die Einhaltung dieser Einschränkungen.
Wenn ovec kein NULL-Zeiger ist, werden Bearbeitungsroutine, Maske und
Flags, die dem Signal vor dem Aufruf von sigvec zugeordnet waren, an
den Benutzer ausgegeben. Ein Aufruf von sigvec, bei dem vec ein NULL-
Zeiger und ovec kein NULL-Zeiger ist, kann verwendet werden, um fest-
zustellen, welche Bearbeitungsinformationen derzeit für ein Signal
gelten, ohne diese Informationen zu ändern.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
sigvec(3) (BSD Compatibility Package) sigvec(3)
Es folgt eine Liste aller Signale mit den Namen aus der Include-Datei
/usr/include/signal.h:
SIGHUP Hangup
SIGINT Interrupt
SIGQUIT * Quit
SIGILL * Ungültige Anweisung
SIGTRAP * Ablaufverfolgungsunterbrechung
SIGABRT * Abbruch [generiert durch die Routine abort(3C)]
SIGEMT * Emulatorunterbrechung
SIGFPE * Arithmetische Ausnahmebedingung
SIGKILL Kill (Abfangen, Blockieren, Ignorieren nicht möglich)
SIGBUS * Busfehler
SIGSEGV * Verletzung der Segmentierungsregeln
SIGSYS * Ungültiges Argument in Systemaufruf
SIGPIPE Schreiben in eine Pipe oder anderen Socket ohne Leser
SIGALRM Alarm
SIGTERM Software-Beendigungssignal
SIGURG - Dringende Bedingung in Socket
SIGSTOP + Stop (Abfangen, Blockieren, Ignorieren nicht möglich)
SIGTSTP + Von der Tastatur generiertes Signal stoppen
SIGCONT - Weiter nach Stopp (Blockieren nicht möglich)
SIGCHLD - Sohnstatus hat sich geändert
SIGTTIN + Lesen im Hintergrund vom Steuerungsterminal nicht möglich
SIGTTOU + Schreiben im Hintergrund auf Steuerungsterminal nicht
möglich
SIGIO - E/A auf Deskriptor möglich [siehe fcntl(2)]
SIGXCPU CPU-Zeitlimit überschritten [siehe setrlimit(2)]
SIGXFSZ Max. Dateigröße überschritten [siehe setrlimit(2)]
SIGVTALRM Alarm für virtuelle Prozeßzeit [siehe setitimer(3C)]
SIGPROF Alarm für Timer zur Profilerstellung [siehe setitimer(3C)]
SIGWINCH - Fenster geändert [siehe termio(7)]
SIGUSR1 Benutzerdefiniertes Signal 1
SIGUSR2 Benutzerdefiniertes Signal 2
Bei den Signalen, die in der Liste mit einem Stern ("*") versehen
sind, wird ein Speicherabzug erstellt, wenn sie nicht abgefangen oder
ignoriert werden.
Wenn eine Signalbearbeitungsroutine installiert ist, bleibt sie
solange installiert, bis ein neuer sigvec-Aufruf erfolgt oder execve
ausgeführt wird. Dies gilt nicht, wenn das Bit SVRESETHAND in den
Flags für das Signal gesetzt ist. In diesem Fall wird der Wert der
Bearbeitungsroutine für das abgefangene Signal auf SIGDFL gesetzt,
bevor die Funktion zum Abfangen von Signalen aktiviert wird. Dies gilt
nicht für die Signale SIGILL, SIGPWR und SIGTRAP. Wenn das oben
genannte Bit gesetzt ist, wird das Bit für dieses Signal in der Sig-
nalmaske nicht gesetzt. Wenn das Signal nicht durch die zugehörige
Signalmaske blockiert wird, werden weitere Vorkommnisse des Signals
nicht blockiert. Das Flag SVRESETHAND ist in BSD 4.2 nicht verfügbar
und sollte daher nicht verwendet werden, wenn das Programm abwärts
kompatibel sein muß.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
sigvec(3) (BSD Compatibility Package) sigvec(3)
Die Standardaktion für ein Signal kann wieder eingesetzt werden, indem
die Bearbeitungsroutine für das Signal auf SIGDFL gesetzt wird; hier-
bei handelt es sich um eine Beendigung, außer bei den Signalen, die
mit "-" oder "+" markiert sind. Mit "-" markierte Signale gehen verlo-
ren, wenn es sich um eine SIGDFL-Aktion handelt; bei mit "+" markier-
ten Signalen wird der Prozeß angehalten. Wenn der Prozeß beendet wird
und es sich um eines der in der Liste mit Stern gekennzeichneten Sig-
nale handelt, wird im aktuellen Arbeitsverzeichnis des empfangenden
Prozesses ein Speicherabzug erstellt.
Wenn die Bearbeitungsroutine für das Signal SIGIGN ist, wird das Sig-
nal anschließend ignoriert und noch anstehende Wiederholungen dieses
Signals werden gelöscht.
Kommt es bei bestimmten Systemaufrufen zu einem abgefangenen Signal,
wird dieser Aufruf normalerweise automatisch neu gestartet. Durch Set-
zen des Bit SVINTERRUPT in den Flags für das Signal, kann ein vorzei-
tiges Beenden des Aufrufs erzwungen werden, wobei der Fehler EINTR
zurückgegeben wird. Das Flag SVINTERRUPT ist in BSD 4.2 nicht verfüg-
bar und sollte daher nicht verwendet werden, wenn das Programm abwärts
kompatibel sein muß. Hierdurch sind die Systemaufrufe read oder write
auf langsamen Geräten (wie einem Terminal, einer Pipe oder einem ande-
ren Socket, nicht jedoch bei einer Datei) betroffen sowie die Warte-
zeit bei einem wait.
Nach fork oder vfork übernimmt der Sohnprozeß alle Signale, die Sig-
nalmaske, den Signal-Stack und die Flags für Neustart/Interrupt und
für das Zurücksetzen der Signalbearbeitungsroutine.
Mit dem Aufruf von execve werden alle abgefangenen Signale auf ihre
Standardaktion zurückgesetzt. Außerdem werden alle Signale, die im
Benutzer-Stack abgefangen werden sollen, zurückgesetzt. Ignorierte
Signale werden auch weiterhin ignoriert. Die Signalmaske bleibt unver-
ändert; Signale, die Systemaufrufe unterbrechen, werden nicht geän-
dert.
Die Genauigkeit der Adresse addr hängt vom Rechner ab. Manche Rechner
geben zum Beispiel eine Adresse aus, die sich auf derselben Seite
befindet wie die Adresse, die den Fehler verursacht hat. Wenn keine
geeignete addr ermittelt werden kann, wird sie auf SIGNOADDR gesetzt.
RÜCKGABEWERT
Der Wert 0 zeigt an, daß der Aufruf erfolgreich ausgeführt wurde. Bei
dem Wert -1 ist ein Fehler aufgetreten, und errno wird gesetzt, um die
Fehlerursache anzuzeigen.
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
sigvec(3) (BSD Compatibility Package) sigvec(3)
DIAGNOSE
Bei einer der folgenden Bedingungen schlägt sigvec fehl, und es wird
keine neue Signalbearbeitungsroutine installiert:
EFAULT Entweder vec oder ovec ist kein NULL-Zeiger und zeigt auf
Speicher, der für den Adreßbereich des Prozesses nicht gültig
ist.
EINVAL sig ist keine gültige Signalnummer, oder es handelt sich um
das Signal SIGKILL oder SIGSTOP.
HINWEISE
SIGPOLL ist ein Synonym für SIGIO. Ein SIGIO wird ausgegeben, wenn für
einen Datei-Deskriptor zu einer STREAMS-Datei [siehe introprm2(2)]
ein auswählbares Ereignis ansteht. Wenn dieser Deskriptor nicht in den
asynchronen Modus gesetzt wurde [siehe fcntl(2)], muß ein Prozeß aus-
drücklich anfordern, daß dieses Signal mit dem ioctl-Aufruf ISETSIG
[siehe streamio(7)] gesendet werden soll. Andernfalls kann der Prozeß
das Signal SIGPOLL niemals empfangen.
Die Bearbeitungsroutine kann folgendermaßen deklariert werden:
void handler(sig, code, scp, addr)
int sig, code;
struct sigcontext *scp;
char *addr;
Dabei gilt folgendes:
sig Die Signalnummer.
code Ein Parameter bestimmter Signale, der zusätzliche Detailangaben
liefert.
scp Ein Zeiger auf die sigcontext-Struktur (definiert in signal.h),
die zur Wiederherstellung des Kontextes in den Zustand vor dem
Auftreten des Signals dient und addr ist zusätzliche Adreßin-
formationen
Die Signale SIGKILL, SIGSTOP und SIGCONT können nicht ignoriert wer-
den.
SIEHE AUCH
exec(2), fcntl(2), fork(2), getrlimit(2), ioctl(2), kill(2),
ptrace(2), read(2), signal(2), umask(2), wait(2), write(2),
sigblock(3), sigpause(3), sigsetmask(3), sigstack(3), wait3(3),
getitimer(3C), setjmp(3C), setjmp(3C-ucb), signal(3-ucb), signal(5),
streamio(7), termio(7).
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98