Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ sigvec(3) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

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)

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

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026