PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN UNIX/Linux-Interprozesskommunikation 8. UNIX/Linux-Signale Wintersemester 2015/16
UNIX/Linux-IPC-Mechanismen Nachrichtenbasierter Informationsaustausch: 5. 1. Nachrichten(warte)schlangen ( message queues ) ç System V IPC 2. Sockets ç BSD-UNIX Speicherbasierter Informationsaustausch: 6. 3. Gemeinsame Speicherbereiche ( shared memory ) ç System V IPC 7. 4. Pipes (Named Pipes und FIFOs) ç Version 7 Signale: 8. 5. Asynchrone UNIX-Signale ç Version 7 Synchronisationsmechanismen: 6. UNIX-Semaphore ç System V IPC ws 2015/16 H.-A. Schindler Folie: 8-2
Signale: Grundsätzliches Ursprung: Ø erstmalig in (Bell Labs) UNIX Version 7: als unzuverlässige Signale Zweck: Prozess(e) (ohne längere Botschaft) über Auftreten bestimmter Ereignisse informieren Signale sind nummeriert: Ø ein bestimmter Ereignistyp ist jeweils fest an ein bestimmtes Signal gekoppelt Ø der Interruptmechanismus auf Prozess-Ebene (vergl. Vorlesung) mögliche Ereignisse: 1. (synchrone) Fehlerereignisse 2. asynchrone Ereignisse 3. nutzerdefinierte Ereignisse (neuer) ws 2015/16 H.-A. Schindler Folie: 8-3
Fehler-Ereignisse Ursache: können bei Ausführung eines Prozesses entstehen, also synchron zu dessen Abarbeitung Beispiele: Prozess spricht unzulässige Speicheradresse an Prozess will ungültige Anweisung ausführen (nichtexistierender Befehlscode, z.b. durch versehentliche Abarbeitung von Daten). Division durch Null... ws 2015/16 H.-A. Schindler Folie: 8-4
Asynchrone Ereignisse Ø haben mit Ausführung eines Prozesses nichts zu tun Ø treten unabhängig davon und folglich asynchron dazu auf Beispiele: ein Prozess aus Menge kooperativ arbeitender Prozesse sendet anderen (vereinbartes) Signal, um auf internes Ereignis bei ihm selbst aufmerksam zu machen (z.b. Zwischenergebnisse fertiggestellt) Abbruch eines Kinderprozesses bewirkt Signal an seinen Elternprozess Gerätetreiber kann Signal an einen Prozess senden (z.b. bei Fehler) Wenn ein Prozess einen Alarm-Zeitpunkt gesetzt hat, sendet Betriebssystem ein Alarm-Signal, wenn die programmierte Zeit vergangen ist.... ws 2015/16 H.-A. Schindler Folie: 8-5
Signale: Funktionsweise Ø Signale über Betriebssystem-Kern an jeweiligen Prozess gesendet Ø außer durch Ereignisse kann Kern auch durch Systemaufrufe kill(.. ) sigsend(..) [in neueren Systemen] veranlasst werden, an spezifizierten Prozess Signal zu senden. UNIX-Signale: UNIX (u. Linux) definieren Menge von Signalen Standardmäßig: jedes Signal an bestimmten Ereignistyp gekoppelt Außerdem: 2 Signale, denen Nutzer selbst Bedeutung zuweisen kann Jedes Signal kann an jeden Prozess gesendet werden. Empfängerprozess kann seine Reaktion auf bestimmtes Signal in Signal- Behandlungsroutine ( signal handler ) selbst festlegen ws 2015/16 H.-A. Schindler Folie: 8-6
Signale: Funktionsweise weiter UNIX-Signale: Signal-Behandlungsroutine ( signal handler ) davon gibt es 2 Ausnahmen ohne bzw. ohne aktivierte Signalbehandlungsroutine: Ø für jedes Signal Standard-Reaktion definiert Ø Verfahrensweise erinnert an Interrupt-Behandlung in Betriebssystemen, daher auch als Interruptbehandlung auf Prozessebene bezeichnet. ws 2015/16 H.-A. Schindler Folie: 8-7
Tabelle: Signale Nr. symbol. Beschreibung Standard-Reaktion 1 SIGHUP Verbindung unterbrochen ( hangup ) Prozess beenden 2 SIGINT Unterbrechung ( Interrupt ) d. Prozesses Prozess beenden 3 SIGQUIT Programmabbruch Prozess beenden + Core 4 SIGILL nichtdeutbarer ( illegal ) Befehl Prozess beenden + Core 5 SIGTRAP Hardwarefehler ( trace trap ) Prozess beenden + Core 6 SIGABRT abnormale Prozessbeendigung ( abort ) Prozess beenden + Core 7 SIGEMT Hardwarefehler ( emulate instruction executed ) Prozess beenden + Core 8 SIGFPE Gleitkommafehler ( floating point exception ) Prozess beenden + Core 9 SIGKILL bedingungsloser Prozessabbruch ( kill ) Prozess beenden 10 SIGBUS Bus-Fehler ( bus error ) Prozess beenden + Core 11 SIGSEGV Speicherzugriff unzulässig Prozess beenden + Core ( segmentation violation ) ws 2015/16 H.-A. Schindler Folie: 8-8
Tabelle: Signale Nr. symbol. Beschreibung Standard-Reaktion 12 SIGSYS nichtexistier. Systemaufruf ( system call ) Prozess beenden + Core 13 SIGPIPE Schreiben in Pipe ohne Reader ( pipe ) Prozess beenden 14 SIGALRM Wecker ( alarm ) Prozess beenden 15 SIGTERM Beenden ( terminate ) Prozess beenden 16 SIGURG wichtige Socketbedingung ( urgent condition ) Ignorieren 17 SIGSTOP Prozess anhalten ( stop ) Prozess anhalten 18 SIGTSTP Stopsignal von Tastatur ( terminal stop ) Prozess anhalten 19 SIGCONT angehaltenen Prozess fortsetzen ( continue ) Fortsetzen/Ignorieren 20 SIGCHLD Statusänderung bei Kindprozess ( child ) Ignorieren 21 SIGTTIN Hintergrund-Leseversuch von Terminal Prozess anhalten 22 SIGTTOU Hintergrund-Schreibversuch auf Terminal Prozess anhalten ( tty out ) ws 2015/16 H.-A. Schindler Folie: 8-9
Tabelle: Signale Nr. Symbol Beschreibung Standard-Reaktion 23 SIGIO asynchrone E/A möglich ( I/O ) à fcntl(2) Ignorieren 24 SIGXCPU max. CPU-Zeit überschritten à setrlimit(2) Prozess beenden 25 SIGXFSZ max. Dateigröße überschritten à setrlimit(2) Prozess beenden 26 SIGVTALRM Timer f. virtuelle Zeit abgelaufenà setitimer(2) Prozess beenden 27 SIGPROF Profiling-Timer abgelaufen à setitimer(2) Prozess beenden 28 SIGWINCH Größenänderung Terminalfenster ( window change ) Ignorieren 29 SIGINFO Statusanforderung von der Tastatur Ignorieren 30 SIGUSR1 nutzerdefiniertes Signal 1 Prozess beenden 31 SIGUSR2 nutzerdefiniertes Signal 2 Prozess beenden rot markierte Signale können weder abgefangen noch ignoriert werden blau markierte Signale Bedeutung muss durch Nutzer definiert werden Tabelle zusammengestellt unter Verwendung der Bücher: [Ehses+2005] S.164 / [Stevens95] S.299 / [Goodheart+94] S.276/277 (vergleiche Teil Literaturhinweise ) ws 2015/16 H.-A. Schindler Folie: 8-10
ACHTUNG: VORSICHT!! Ø Bei Signalen gibt es größere Unterschiede zwischen Implementierung verschiedener UNIX-Varianten I!! Vergabe der Signal-Nummern Anzahl der Signale Reaktionsweise auf Signale, z.b. sysv-typisch und bsd-typisch ws 2015/16 H.-A. Schindler Folie: 8-11
Signalempfang: Datenstrukturen im UNIX-PCB Array: enthält für jedes mögliche Signal ein Bit Array: enthält für jedes mögliche Signal Platz für eine (virtuelle) Adresse è Bei vorhandener und aktivierter Behandlungsroutine ist dies die Adresse der Signal-Behandlungsroutine ws 2015/16 H.-A. Schindler Folie: 8-12
Signale: Auslösung Aufruf im Programm: <rv_kill> = kill(<process_id>, <signal_number>); rv_kill (int) Rückkehrwert =0: O.K. = -1: Fehler process_id (int) Nummer des Prozesses signal_ (int) Nummer oder symbolische Bezeichnung des Signals number Aufruf-Beispiel: xx = kill(1257, SIGALRM); // Alarm-Signal Aufruf mit Kommando (Terminal/Shell): kill -<signal_number> <process_id> Aufruf-Beispiel: kill -9 1257 // bedingungloser Abbruch von Prozess 1257 ws 2015/16 H.-A. Schindler Folie: 8-13
Singnale: Anbinden einer Signalbehandlungsroutine Aufruf im Programm: <rv> = signal(<signal_number>, <signal_handler>); rv (int) Rückkehrwert: =0: O.K. = -1: Fehler signal_ (int) Nummer oder symbolische Bezeichnung des Signals number signal_ (*int) Adresse der Signalbehandlungsroutine handler Aufruf-Beispiele: rv = signal(2, handler); rx = signal (SIGINT, signalroutine); ws 2015/16 H.-A. Schindler Folie: 8-14
Signale: Systemaufruf alarm( ) Aufruf im Programm: alarm(<time>); time (int) Zeitangabe (in Sekunden) Aufruf-Beispiel: alarm(12); Wirkung: Ø aufrufender Prozess erhält nach time Sekunden (im Beispiel 12) vom Betriebssystem ein Alarmsignal Bemerkung: Ø andere Reaktion des Prozesses als Standard-Reaktion (=Prozessabbruch) muss in Signalbehandlungs-Routine spezifiziert sein ws 2015/16 H.-A. Schindler Folie: 8-15
Signale: Systemaufruf pause( ) Aufruf im Programm: pause(); Aufruf-Beispiel: pause(); Wirkung: Ø Ausführung des aufrufenden Prozesses wird bis zum Eintreffen eines Signals ausgesetzt (suspendiert) Bemerkung: Ø betreffendes Signal muss durch Behandlungs-Routine abgefangen werden. ws 2015/16 H.-A. Schindler Folie: 8-16
Beispiel 1: Abfangen von Signal 2 main() { int i; void handler(); /* Spezifikation Behandlungsroutine*/ printf("test: Signale\n\n ); signal(2, handler); M: printf("x ); i=0; while(i<15000)i++; /* Verzoegerung */ goto M; } void handler() / * Routine zur Signalbehandlung */ { printf("so kannst Du mich nicht abbrechen!!!...\n ); } ws 2015/16 H.-A. Schindler Folie: 8-17
Beispiel 2: Behandlung von Signal 12 main() { int i; void handler(); /* Spezifikation Behandlungsroutine */ printf("test: Signale\n\n ); } signal(12, handler); execl(); /* fehlerhafter Systemaufruf */ void handler() /* Routine zur Signalbehandlung */ { printf("systemaufruf mit falschem Parameter\n ); signal(12, handler); /*eventuell Routine neu ankoppeln */ } Hinweis zur Behandlungsroutine: Bei einigen UNIX-Versionen ist die Signalbehandlung nach einmaliger Benutzung rückgesetzt und muss neu gesetzt werden! ws 2015/16 H.-A. Schindler Folie: 8-18
Nicht erwähnte relevante Systemaufrufe bzw. Manualeinträge Im Manual-Abschnitt 2: 1. killpg(2) Signal an Prozessgruppe 2. sigaction(2) neuer anstelle signal(..) 3. signalfd(2) 4. sigpending(2) 5. sigprocmask(2) untersuche bzw. ändere geblockte Signale 6. sigqueue(2) 7. sigsuspend(2) ws 2015/16 H.-A. Schindler Folie: 8-19
Nicht erwähnte relevante Systemaufrufe bzw. Manualeinträge im Manual-Abschnitt 3: 1. bsd_signal(3) BSD-typisches Verhalten 2. sysv_signal(3) Bell-Lab-typisches Verhalten 3. raise(3) 4. siginterrupt(3) 5. sigsetops(3) 6. sigvec(3) im Manual-Abschnitt 7: 1. signal(7) alle jeweils definierten Signale 2. feature_test_macros(7) ws 2015/16 H.-A. Schindler Folie: 8-20
Aufgabenstellung (Anregungen) 1. Analysieren Sie die Programme signal2a.c und signal2b.c. Vergleichen Sie beide Programme! Untersuchen Sie, ob die Programme unterschiedlich reagieren, wenn Sie beide jeweils mehrmals mit Crtl/C oder anderweitig mit Signal 2 abzubrechen versuchen. 2. Experimentieren Sie jetzt mit Programm pause.c. Untersuchen Sie, nach welchen Signalen nach der Pause weitergearbeitet wird. Was muss getan werden, um auch nach anderen Signalen eine Weiterarbeit zu ermöglichen? Kann auch nach Signal 9 eine Weiterarbeit ermöglicht werden? Experimentieren Sie zu diesem Punkt auch mit signale2u9.c! 3. Analysieren Sie jetzt Programm signal-alarm.c und führen Sie dieses nach der Kompilierung aus! Wozu kann der Alarm-Mechanismus sinnvoll eingesetzt werden? 4. Mit signale-fehler.c können Sie mit Fehlern beim Aufruf von Signal- Systemaufrufen experimentieren. Beispiele sind vorgegeben. ENDE 8 ws 2015/16 H.-A. Schindler Folie: 8-21