Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ signal(5) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

alarm(2)

exit(2)

getrlimit(2)

ioctl(2)

kill(2)

pause(2)

sigaction(2)

sigaltstack(2)

signal(2)

sigprocmask(2)

sigsend(2)

sigsuspend(2)

wait(2)

waitid(2)

sigsetops(3C)

errno(5)

siginfo(5)

types(5)

ucontext(5)

signal(5)                                                         signal(5)

NAME
     signal - Signale

SYNTAX
     #include <signal.h>

BESCHREIBUNG
     Ein Signal ist die asynchrone Benachrichtigung über ein Ereignis. Ein
     Signal wird für einen Prozeß generiert (oder an einen Prozeß gesen-
     det), wenn das mit dem Signal verbundene Ereignis zum ersten Mal auf-
     tritt. Beispiele für solche Ereignisse sind Gerätefehler, abgelaufene
     Zeitgeber oder eine Aktivität am Terminal. Weiterhin können Signale
     das Ergebnis eines kill()- oder sigsend()-Systemaufrufs sein. Unter
     bestimmten Umständen generiert dasselbe Ereignis Signale für mehrere
     Prozesse. Ein Prozeß kann die Quelle und die genaue Ursache für die
     Erzeugung eines Signals feststellen [siehe siginfo(5)].

     Jeder Prozeß kann eine Systemaktion angeben, die als Reaktion auf
     jedes an ihn gesendete Signal auszuführen ist. Dies wird als die Vor-
     einstellung des Signals bezeichnet. Die Gruppe der Signalaktionen für
     einen Prozeß wird von der des Vaterprozesses initialisiert. Nachdem
     eine Aktion für ein bestimmtes Signal installiert wurde, gilt diese so
     lange, bis eine andere Voreinstellung explizit durch einen Aufruf von
     sigaction()), signal() oder sigset() angefordert wird, oder bis der
     Prozeß eine exec-Funktion ausführt [siehe sigaction(2) und signal(2)].
     Wenn ein Prozeß eine der exec-Funktionen ausführt, werden alle Sig-
     nale, deren Voreinstellung auf Bearbeitung des Signals steht, auf
     SIGDFL umgestellt. Alternativ dazu kann ein Prozeß anfordern, daß das
     System die Voreinstellung eines Signals nach dessen Empfang eines Sig-
     nals automatisch auf SIGDFL umstellt [siehe sigaction(2) und
     signal(2)].

     Ein Signal gilt als an einen Prozeß ausgeliefert, sobald die für die-
     sen Prozeß und dieses Signal vorgesehene Aktion ausgeführt wurde. Von
     dem Zeitpunkt seiner Erzeugung bis zu seiner Auslieferung wird ein
     Signal als unbearbeitet (Pending) bezeichnet [siehe sigpending(2)].
     Normalerweise kann dieser Zustand von einer Anwendung nicht erkannt
     werden. Ein Signal kann jedoch von seiner Auslieferung an einen Prozeß
     blockiert sein [siehe signal(2) und sigprocmask(2)]. Wenn für ein
     blockiertes Signal eine andere Aktion als das Ignorieren des Signals
     vorgesehen ist, und wenn dieses Signal für den Prozeß erzeugt wird, so
     bleibt das Signal unbearbeitet, bis es entweder freigegeben wird, oder
     sich die Voreinstellung für das Signal dahingehend ändert, daß es in
     Zukunft ignoriert werden soll. Wenn die Voreinstellung für ein blok-
     kiertes Signal vorsieht, daß das Signal ignoriert wird, und ein sol-
     ches Signal für den Prozeß erzeugt wird, so wird es unmittelbar nach
     seiner Erzeugung gelöscht.

     Jeder Prozeß hat eine Signalmaske, die die Menge der Signale defi-
     niert, deren Auslieferung an den Prozeß zur Zeit blockiert ist [siehe
     sigprocmask(2)]. Die Signalmaske für einen Prozeß wird durch die des
     Vaterprozesses initialisiert.



Seite 1                      Reliant UNIX 5.44               Gedruckt 11/98

signal(5)                                                         signal(5)

     Welche Aktion als Antwort auf ein Signal auszuführen ist, wird erst
     bei der Auslieferung des Signals festgelegt, so daß Änderungen nach
     der Erzeugung des Signals möglich sind. Die Festlegung der Aktion ist
     dabei unabhängig von dem Signalauslöser.

     signal.h deklariert Konstanten, die sich auf Systemsignale beziehen:
     _______________________________________________________________________
    | Name     |  Wert|  Standard|  Ereignis                               |
    |__________|______|__________|_________________________________________|
    | SIGHUP   |    1 |  Exit    |  Hangup [siehe termio(7)]               |
    | SIGINT   |    2 |  Exit    |  Unterbrechungssignal [siehe termio(7)] |
    | SIGQUIT  |    3 |  Core    |  Ende [siehe termio(7)]                 |
    | SIGILL   |    4 |  Core    |  Unzulässige Instruktion                |
    | SIGTRAP  |    5 |  Core    |  Unterbrechung (Trap) bei Ablaufverfol- |
    |          |      |          |  gung                                   |
    | SIGIOT   |    6 |  Core    |  Abbruch                                |
    | SIGABRT  |    6 |  Core    |  Abbruch                                |
    | SIGEMT   |    7 |  Core    |  Unterbrechung (Trap) bei Emulation     |
    | SIGFPE   |    8 |  Core    |  Arithmetische Ausnahmesituation        |
    | SIGKILL  |    9 |  Exit    |  Bedingungsloser Abbruch                |
    | SIGBUS   |   10 |  Core    |  Adreßfehler                            |
    | SIGSEGV  |   11 |  Core    |  Unerlaubter Zugriff auf Hauptspeicher  |
    | SIGSYS   |   12 |  Core    |  Fehlerhafter Systemaufruf              |
    | SIGPIPE  |   13 |  Exit    |  Ausgabe auf Pipe, von der niemand      |
    |          |      |          |  liest (Broken Pipe)                    |
    | SIGALRM  |   14 |  Exit    |  Ablauf der mit alarm vorgegebenen      |
    |          |      |          |  Zeitscheibe                            |
    | SIGTERM  |   15 |  Exit    |  Beendet                                |
    | SIGUSR1  |   16 |  Exit    |  Benutzersignal 1                       |
    | SIGUSR2  |   17 |  Exit    |  Benutzersignal 2                       |
    | SIGCHLD  |   18 |  Ignore  |  Status eines Sohnprozesses             |
    | SIGPWR   |   19 |  Ignore  |  Stromausfall/Neustart                  |
    | SIGWINCH |   20 |  Ignore  |  Änderung der Fenstergröße              |
    | SIGURG   |   21 |  Ignore  |  Dringender Vorfall an Socket           |
    | SIGIO    |   22 |  Ignore  |  E/A auf Socket möglich (entspricht     |
    |          |      |          |  SIGPOLL)                               |
    | SIGPOLL  |   22 |  Exit    |  Regelmäßig auftretendes Ereignis       |
    | SIGSTOP  |   23 |  Stop    |  Angehalten (Signal)                    |
    | SIGTSTP  |   24 |  Stop    |  Angehalten (Benutzer) [siehe termio(7)]|
    | SIGCONT  |   25 |  Ignore  |  Fortgesetzt                            |
    | SIGTTIN  |   26 |  Stop    |  Angehalten (Eingabe auf TTY) [siehe    |
    |          |      |          |  termio(7)]                             |
    | SIGTTOU  |   27 |  Stop    |  Angehalten (Ausgabe auf TTY) [siehe    |
    |          |      |          |  termio(7)]                             |
    | SIGVTALRM|   28 |  Exit    |  Virtueller Zeitnehmer abgelaufen       |
    | SIGPROF  |   29 |  Exit    |  Zeitgeber für Profildaten abgelaufen   |
    | SIGXCPU  |   30 |  Core    |  CPU-Zeitlimit überschritten [siehe     |
    |          |      |          |  getrlimit(2)]                          |
    | SIGXFSZ  |   31 |  Core    |  Maximale Dateigröße überschritten      |
    |          |      |          |  [siehe getrlimit(2)]                   |
    |__________|______|__________|_________________________________________|



Seite 2                      Reliant UNIX 5.44               Gedruckt 11/98

signal(5)                                                         signal(5)

     Über die Systemaufrufe signal(), sigsett() und sigaction() kann ein
     Prozeß für ein Signal eine von drei möglichen Voreinstellungen vorse-
     hen: die für dieses Signal vorgesehene Standardaktion, das Ignorieren
     des Signals oder die Bearbeitung des Signals.

     signal.h enthält die Definitionen folgender symbolischer Konstanten,
     die zu einem Ausdruck des Typs void(*)(int) expandieren, und deren
     Wert keiner deklarierbaren Funktion entspricht:

     SIGDFL           Standardsignalbehandlung.

     SIGERR           Return-Wert von signal() bei einem Fehler.

     SIGIGN           Ignorieren des Signals.

     Außerdem sind in signal.h die folgenden Datentypen definiert:

     sigatomict      Integraltyp eines Objekts, auf das auch bei einer
                       asynchronen Unterbrechung zugegriffen werden kann.

     sigsett          Integraltyp oder Struktur eines Objekts für die Dar-
                       stellung von Signalmengen.

     pidt             Ist in <sys/types.h> [siehe types(5)] beschrieben.

     signal.h stellt die Deklaration von struct sigaction zur Verfügung,
     die zumindest die folgenden Komponenten enthält.

     Nur gültig, wenn mit "c89" generiert:

     void(*sahandler)(int)
                       Aktion bei Empfang eines Signals.

     sigsett samask  Signalmenge, die während der Ausführung einer Sig-
                       nalbehandlungsfunktion blockiert wird.

     int saflags      Spezielle Flags.

     void (*)(int, siginfot *, void *) sasigaction
                       Zeiger auf eine Signalbehandlungsfunktion oder eines
                       der Makros SIGIGN oder SIGDFL.

     Nur gültig, wenn mit "cc" generiert:

          void         (*sahandler)();
          sigsett     samask;
          int          saflags;

     Der von sahandler und sasigaction belegte Speicher kann sich über-
     lappen, so daß ein portierbares Programm nicht beide Funktionen
     gleichzeitig verwenden darf.



Seite 3                      Reliant UNIX 5.44               Gedruckt 11/98

signal(5)                                                         signal(5)

     Die folgenden Konstanten sind in signal.h deklariert:

     SANOCLDSTOP      Bei Abbruch von Kindprozessen soll SIGCHILD nicht
                       generiert werden.

     SIGBLOCK         Die Ergebnismenge besteht aus der aktuellen Menge
                       und der Signalmenge, auf die das Argument set zeigt.

     SIGUNBLOCK       Die Ergebnismenge ist die Schnittmenge aus der aktu-
                       ellen Menge und der Signalmenge, auf die das Argu-
                       ment set zeigt.

     SIGSETMASK       Die Ergebnismenge ist die Signalmenge, auf die set
                       zeigt.

     SAONSTACK        Die Auslieferung der Signale erfolgt in einen alter-
                       nativen Stack.

     SARESETHAND      Die Voreinstellungen der Signale werden vor Eintritt
                       in die Signalbehandlungsroutinen auf SIGDFL
                       gesetzt.

     SARESTART        Bestimmte Funktionen können erneut gestartet werden.

     SASIGINFO        Zusätzliche Informationen werden bei Empfang eines
                       Signals an die Signalbehandlungsroutinen übergeben.

     SANOCLDWAIT      Die Implementierungen erstellen nach dem Abbruch der
                       Sohnprozesse keine Zombie-Prozesse.

     SANODEFER        Signale werden bei Eintritt in die Signalbehand-
                       lungsroutine nicht automatisch blockiert.

     SSONSTACK        Der Prozeß wird auf einem alternativen Signal-Stack
                       ausgeführt.

     SSDISABLE        Der alternative Signal-Stack ist deaktiviert.

     MINSIGSTKSZ       Mindestgröße des Stacks für eine Signalbehandlungs-
                       routine.

     SIGSTKSZ          Standardgröße in Bytes für den alternativen Signal-
                       Stack.

     Die Struktur ucontextt wird über typedef definiert wie in
     <ucontext.h> beschrieben [siehe ucontext(5)].








Seite 4                      Reliant UNIX 5.44               Gedruckt 11/98

signal(5)                                                         signal(5)

     Die Include-Datei signal.h definiert den Typ stackt als eine Struk-
     tur, die zumindest folgende Komponenten enthält:

     void *sssp       Stack-Basis oder -Zeiger.

     sizet sssize    Stack-Größe.

     int ssflags      Flags.

     Die Include-Datei signal.h definiert die Struktur sigstack, die zumin-
     dest folgende Komponenten enthält:

     int ssonstack    Dieser Wert is ungleich Null, wenn der Signal-Stack
                       verwendet wird.

     void *sssp       Zeiger auf den Signal-Stack.

     Die Include-Datei signal.h definiert den Typ siginfot als eine Struk-
     tur, die zumindest folgende Komponenten enthält:

     int sisigno      Signalnummer.

     int sierrno      Wenn ungleich Null, ein diesem Signal zugeordneter
                       errno-Wert wie in <errno.h> definiert.

     int sicode       Signalcode.

     pidt sipid      ID des sendenden Prozesses.

     uidt siuid      Reale Benutzer-ID des sendenden Prozesses.

     void *siaddr     Adresse der fehlerhaften Anweisung.

     int sistatus     Exit-Wert oder -Signal.

     long siband      Gruppe von Ereignissen für SIGPOLL.

     Die in der Spalte Code der folgenden Tabelle aufgeführten Makros sind
     zur Verwendung als Werte von sicode definiert. Hierbei handelt es
     sich um die signalspezifische Ursache für die Signalerzeugung.














Seite 5                      Reliant UNIX 5.44               Gedruckt 11/98

signal(5)                                                         signal(5)

     Signal    Code           Ursache
     _________________________________________________________________________
     SIGILL    ILLILLOPC     ungültige Prozessoranweisung
               ILLILLOPN     ungültiger Operand
               ILLILLADR     ungültiger Adressierungsmodus
               ILLILLTRP     ungültige Unterbrechung (Trap)
               ILLPRVOPC     privilegierte Prozessoranweisung
               ILLPRVREG     privilegierte Register
               ILLCOPROC     Fehler des Coprozessors
               ILLBADSTK     interner Stack-Fehler
     _________________________________________________________________________
     SIGFPE    FPEINTDIV     ganzzahlige Division durch Null
               FPEINTOVF     ganzzahliger Überlauf
               FPEFLTDIV     Gleitkommafehler: Division durch Null
               FPEFLTOVF     Gleitkommafehler: Überlauf
               FPEFLTUND     Gleitkommafehler: Unterlauf
               FPEFLTRES     Gleitkommafehler: ungenaues Ergebnis
               FPEFLTINV     ungültige Gleitkommaoperation
               FPEFLTSUB     Index außerhalb des gültigen Bereichs
     _________________________________________________________________________
     SIGSEGV   SEGVMAPERR    Adresse nicht auf Objekt abgebildet
               SEGVACCERR    ungültige Zugriffsrechte für abgebildetes Objekt
     _________________________________________________________________________
     SIGBUS    BUSADRALN     ungültige Adreßausrichtung
               BUSADRERR     nichtexistierende physische Adresse
               BUSOBJERR     objektspezifischer Hardwarefehler
     _________________________________________________________________________
     SIGTRAP   TRAPBRKPT     Prozeß-Haltepunkt
               TRAPTRACE     Prozeß-Trace-Unterbrechung
     _________________________________________________________________________
     SIGCHLD   CLDEXITED     Sohnprozeß über exit beendet
               CLDKILLED     Sohnprozeß wurde nicht normal beendet, ohne
                              Erstellung einer Speicherabzugsdatei
               CLDDUMPED     Sohnprozeß wurde nicht normal beendet, mit
                              Erstellung einer Speicherabzugsdatei
               CLDKILLED     Sohnprozeß über kill beendet
               CLDDUMPED     Sohnprozeß wurde nicht normal beendet
               CLDTRAPPED    überwachter Sohnprozeß empfing Signal
               CLDSTOPPED    Sohnprozeß angehalten
               CLDCONTINUED  angehaltener Sohnprozeß wurde fortgesetzt
     _________________________________________________________________________
     SIGPOLL   POLLIN        Dateneingabe verfügbar
               POLLOUT       Ausgabepuffer verfügbar
               POLLMSG       Eingabemeldung verfügbar
               POLLERR       E/A-Fehler
               POLLPRI       Eingabe mit hoher Priorität verfügbar
               POLLHUP       Verbindung abgebrochen

     Implementierungen können zusätzliche, in dieser Liste nicht enthaltene
     sicode-Werte unterstützen, sie können Werte aus der Liste unter ande-
     ren Umständen, als den in der Liste beschriebenen, erzeugen, und sie
     können Erweiterungen oder auch Einschränkungen enthalten, die


Seite 6                      Reliant UNIX 5.44               Gedruckt 11/98

signal(5)                                                         signal(5)

     verhindern, daß einige dieser Werte erzeugt werden. Es werden jedoch
     keine anderen als die in der Liste beschriebenen Werte erzeugt, wenn
     die in der Liste beschriebenen Umstände vorliegen.

     Zusätzlich sind noch folgende signalspezifischen Informationen verfüg-
     bar:

     Signal    Komoponente     Wert
     ______________________________________________________________________
     SIGILL    void * siaddr  Adresse der fehlerhaften Anweisung
     SIGFPE
     ______________________________________________________________________
     SIGSEGV   void * siaddr  Adresse des fehlerhaften Speicherzugriffs
     SIGBUS
     ______________________________________________________________________
     SIGCHLD   pidt sipid    Prozeß-ID des Sohnprozesses
               int sistatus   Exit-Wert oder -Signal
               uidt siuid    Reale Benutzer-ID des Prozesses, der das
                               Signal gesendet hat
     ______________________________________________________________________
     SIGPOLL   long siband    Gruppe von Ereignissen für POLLIN, POLLOUT
                               oder POLLMSG

     Für einige Implementierungen kann der Wert von siaddr ungenau sein.

     Die folgenden Funktionen sind in signal.h deklariert, sie können aber
     auch als Makros definiert werden:

    void (*bsdsignal(int sig, void (*func)(int)))(int);
    int kill(pidt pid, int sig);
    int killpg(pidt pgrp, int sig);
    int raise(int sig);
    int sigaction(int sig, const struct sigaction *act,
    int sigaction(int sig, const struct sigaction *act,
                    struct sigaction *oact);
    int sigaddset(sigsett *set, int signo);
    int sigaltstack(const stackt *ss, stackt *oss);
    int sigdelset(sigsett *set, int signo);
    int sigemptyset(sigsett *set);
    int sigfillset(sigsett *set);
    int sighold(int sig);
    int sigignore(int sig);
    int siginterrupt(int sig, int flag);
    int sigismember(const sigsett *set, int);
    void (*signal(int sig, void (*func) (int))) (int);
    int sigpause(int sig);
    int sigpending(sigsett *set);
    int sigprocmask(int how, const sigsett *set, sigsett *oset);
    int sigrelse(int sig); void *sigset(int sig, void
    (*disp)(int)))(int); int sigstack(struct sigstack *ss,
              struct sigstack *oss);
    int sigsuspend(const sigsett *sigmask);


Seite 7                      Reliant UNIX 5.44               Gedruckt 11/98

signal(5)                                                         signal(5)

   Standardaktion

     Eine Voreinstellung von SIGDFL gibt die Standardaktion an. Die Stan-
     dardaktion eines jeden Signals ist in der obigen Liste aufgeführt.
     Auswahlmöglichkeiten sind:

     Exit     Bei Empfang des Signals muß der empfangende Prozeß beendet
              werden, mit allen Konsequenzen, wie sie in exit(2) beschrie-
              ben sind.

     Core     Bei Empfang des Signals muß der empfangende Prozeß beendet
              werden, mit allen Konsequenzen, wie sie in exit(2) beschrie-
              ben sind. Zusätzlich wird ein Speicherabzug (Core) des Pro-
              zesses im aktuellen Arbeitsverzeichnis angelegt.

     Stop     Bei Empfang des Signals wird der empfangende Prozeß angehal-
              ten.

     Ignore   Bei Empfang des Signals wird dieses durch den empfangenden
              Prozeß ignoriert. Dies entspricht der Voreinstellung von
              SIGIGN.

   Signal bearbeiten

     Wird als Voreinstellung die Adresse einer Funktion verwendet, so
     bedeutet dies, daß der Prozeß bei Empfang dieses Signals die Signalbe-
     handlungsroutine an der angegebenen Adresse ausführen soll. Normaler-
     weise erhält die Signalbehandlungsroutine als einziges Argument die
     Nummer des empfangenen Signals; durch die Verwendung der Funktion
     sigaction() zur Voreinstellung können jedoch zusätzliche Parameter
     vorgesehen werden [siehe sigaction(2)]. Solange die Signalbehandlungs-
     routine keine anderen Vorkehrungen trifft, wird der Prozeß nach Been-
     digung der Signalbehandlungsroutine an der Stelle fortgesetzt, an der
     er unterbrochen wurde. Bei Angabe einer ungültigen Funktionsadresse
     ist das Verhalten nicht definiert.

     Wurde die Voreinstellung durch die Funktionen sigset() oder
     sigaction() vorgenommen, so wird das Signal automatisch durch das
     System blockiert, während die Signalbehandlungsfunktion aktiv ist.
     Wenn longjmp() [siehe setjmp(3C)] verwendet wird, um die Signalbehand-
     lungsfunktion zu verlassen, muß das Signal explizit durch den Benutzer
     freigegeben werden [siehe signal(2) und sigprocmask(2)].

     Unterbricht die Ausführung einer Signalbehandlungsroutine einen blok-
     kierten Systemaufruf, so wird die Routine ausgeführt. Der unterbro-
     chene Systemaufruf liefert danach den Wert -1 an den aufrufenden Pro-
     zeß zurück, und errno wird auf den Wert EINTR gesetzt. Ist hingegen
     das Flag SARESTART gesetzt, so wird der Systemaufruf ohne Meldung neu
     gestartet.





Seite 8                      Reliant UNIX 5.44               Gedruckt 11/98

signal(5)                                                         signal(5)

HINWEISE
     Die Voreinstellungen der Signale SIGKILL und SIGSTOP können nicht
     geändert werden. Das System erzeugt einen Fehler, wenn dies versucht
     wird.

     Die Signale SIGKILL und SIGSTOP können nicht blockiert werden. Die
     Einhaltung dieser Einschränkung wird ohne entsprechende Meldung
     erzwungen.

     Empfängt ein Prozeß das Signal SIGCONT, so werden, unabhängig von den
     aktuellen Voreinstellungen, alle unbearbeiteten Signale SIGSTOP,
     SIGTSTP, SIGTTIN und SIGTTOU gelöscht. Außerdem wird der Prozeß fort-
     gesetzt, sofern er angehalten wurde.

     SIGPOLL wird ausgegeben, wenn ein zu einer STREAMS-Datei gehörender
     Dateideskriptor ein unbearbeitetes "auswählbares" Ereignis aufweist.
     Ein Prozeß muß die Zustellung dieses Signals durch einen ioctl-Aufruf
     mit ISETSIG explizit anfordern. Ansonsten wird der Prozeß niemals ein
     Signal SIGPOLL erhalten.

     Wenn die Voreinstellung für das Signal SIGCHLD mit signal() oder
     sigset() vorgenommen wurde, oder mit sigaction() und mit gesetztem
     Flag SANOCLDSTOP, so wird dieses Signal nur dann an den aufrufenden
     Prozeß gesendet, wenn seine Sohnprozesse enden. Ansonsten würde dieses
     Signal auch gesendet, wenn die Sohnprozesse aufgrund der Ablaufsteue-
     rung angehalten oder fortgesetzt wurden.

     Der Name SIGCLD wird ebenfalls in dieser Include-Datei definiert und
     bezeichnet dasselbe Signal wie SIGCHLD. SIGCLD wird aus Kompatibili-
     tätsgründen weiter unterstützt, neue Anwendungen sollten jedoch
     SIGCHLD verwenden.

     Die Voreinstellung von Signalen, die als SIGIGN vererbt werden,
     sollte nicht verändert werden.

SIEHE AUCH
     alarm(2), bsdsignal(2), exit(2), getrlimit(2), introprm2(2),
     ioctl(2), kill(2), pause(2), sigaction(2), sigaltstack(2), signal(2),
     sigprocmask(2), sigsend(2), sigsuspend(2), wait(2), waitid(2),
     sigsetops(3C), errno(5), siginfo(5), types(5), ucontext(5).














Seite 9                      Reliant UNIX 5.44               Gedruckt 11/98

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