Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
Über die Autoren
Über dieses Buch
Linux vs. BSD
1 Der Kernel
2 Die Grundlagen aus Anwendersicht
3 Die Shell
4 Reguläre Ausdrücke
5 Tools zur Dateibearbeitung
6 Die Editoren
7 Shellskriptprogrammierung
8 Benutzerverwaltung
9 Grundlegende Verwaltungsaufgaben
10 Netzwerk-Grundlagen
11 Anwendersoftware für das Netzwerk
12 Netzwerkdienste
13 Mailserver unter Linux
14 LAMP
15 DNS-Server
16 Secure Shell
17 Die grafische Oberfläche
18 Window-Manager und Desktops
19 X11-Programme
20 Multimedia und Spiele
21 Softwareentwicklung
22 Crashkurs in C und Perl
23 Sicherheit
24 Prozesse und IPC
25 Bootstrap und Shutdown
26 Dateisysteme
27 Virtualisierung und Emulatoren
A Die Installation
B Lösungen zu den einzelnen Aufgaben
C Kommandoreferenz
D X11-InputDevices
E MBR
F Die Buch-DVDs
G Glossar
H Literatur

Download:
- ZIP, ca. 6,3 MB
Buch bestellen
Ihre Meinung?

Spacer
 <<   zurück
Linux von Johannes Plötner, Steffen Wendzel
Das distributionsunabhängige Handbuch
Buch: Linux

Linux
2., aktualisierte und erweiterte Auflage
1119 S., 39,90 Euro
Galileo Computing
ISBN 978-3-8362-1090-4
gp 24 Prozesse und IPC
  gp 24.1 Prozessarten
    gp 24.1.1 Hintergrundprozesse
    gp 24.1.2 Dämonprozesse
  gp 24.2 Prozesse in der Shell
    gp 24.2.1 Wechseln zwischen Vorder- und Hintergrund
    gp 24.2.2 Jobs – behalten Sie sie im Auge
    gp 24.2.3 Hintergrundprozesse und Fehlermeldungen
    gp 24.2.4 Wann ist es denn endlich vorbei?
  gp 24.3 Prozesse und Signale
    gp 24.3.1 Das Syscall-Interface
    gp 24.3.2 Signale von der Kommandozeile senden: kill
    gp 24.3.3 Welche Signale gibt es?
    gp 24.3.4 Die Rechte
    gp 24.3.5 In der Praxis: Signale empfangen
  gp 24.4 Prozesse finden und verarbeiten
    gp 24.4.1 top
    gp 24.4.2 ps und pstree
    gp 24.4.3 pgrep, pidof und pkill
  gp 24.5 Prozesse, Scheduling und Prioritäten
    gp 24.5.1 Das Scheduling
    gp 24.5.2 nice und renice
    gp 24.5.3 Echtzeit-Scheduling unter Linux
  gp 24.6 IPC im Detail
    gp 24.6.1 Pipes und FIFOs
    gp 24.6.2 Semaphore
    gp 24.6.3 Message Queues
    gp 24.6.4 Shared Memory
    gp 24.6.5 Unix-Domain-Sockets
  gp 24.7 Zusammenfassung
  gp 24.8 Aufgaben


Galileo Computing

24.3 Prozesse und Signale  downtop

So wie der Prozessor Interrupts als Benachrichtigungen für bestimmte Ereignisse (wie den Ablauf eines Timers oder die Verfügbarkeit aus dem Speicher angeforderter Daten) behandelt, kann ein Prozess über Signale die verschiedensten Ereignisse abfangen.


Galileo Computing

24.3.1 Das Syscall-Interface  downtop

Das eigentliche Versenden und Empfangen von Signalen läuft über den Kernel. Die entsprechenden Schnittstellen sind dabei als Syscalls realisiert:

  • int kill(pid_t pid, int signum);
  • Mit dem kill-Syscall kann man Signale versenden. Das Signal selbst wird dabei intern nur über eine Nummer referenziert, wobei dem Programmierer beziehungsweise dem Benutzer in der Shell auch Signalnamen zur Verfügung stehen. Mit pid wird die PID des Prozesses bezeichnet, der das Signal empfangen soll. Wird hier jedoch 0 angegeben, so wird das Signal an alle Prozesse der eigenen Prozessgruppe gesendet. Bei –1 wird es an alle Prozesse außer init geschickt, und der Wert -PID bezeichnet die Prozessgruppe des Prozesses mit der entsprechenden PID. Ein Beispiel:
#include <sys/types.h> 
#include <signal.h> 
 
int main(int argc, char* argv[]) 
{ 
  kill(1234, SIGTERM); 
  return 0; 
}

Listing 24.14    kill

  • Nach der Einbindung der entsprechenden Headerdateien wird dem Prozess mit der PID 1234 hier das SIGTERM-Signal geschickt.
  • sighandler_t signal(int signum, sighandler_t handler);
  • Diese Funktion dient nun dazu, eine Funktion – einen sogenannten Handler (auch Callback) -- festzulegen, die beim Empfang des entsprechenden Signals vom Kernel aufgerufen werden soll. Allerdings gibt es auch Signale, die aufgrund ihrer Semantik nicht abgefangen werden können, sondern die direkt vom Kernel bearbeitet werden.

Doch für den Anwender ist statt der Frage nach den einzelnen Syscalls die Frage nach den unterschiedlichen Signalen in der Regel interessanter. Dabei kennen Sie aus dem ersten Kapitel bereits verschiedene, mehr oder weniger gnadenlos zum Prozessende führende Signale: SIGKILL und SIGTERM. Doch zunächst soll kurz besprochen werden, wie man eigentlich Signale von der Kommandozeile senden kann.


Galileo Computing

24.3.2 Signale von der Kommandozeile senden: kill  downtop

Dem Benutzer steht mit dem Kommando kill die Möglichkeit zur Verfügung, Signale zu versenden.

Hierbei werden wie beim gleichnamigen Syscall der Signaltyp und die Prozess-ID des Zielprozesses beziehungsweise dessen Jobnummer angegeben:

$ kill 499 
$ kill –9 500 
$ kill -SIGKILL 501

Listing 24.15    Beispielaufruf des kill-Kommandos

Wird kill ohne einen Signalparameter und lediglich mit einer Prozess-ID aufgerufen, so wird das Signal SIGTERM an den Prozess gesendet, das ihn zur Beendigung auffordert, aber nicht zwingend dessen Beendigung erwirkt – denn das Signal kann abgefangen werden.


Galileo Computing

24.3.3 Welche Signale gibt es?  downtop

Es gibt also zwei Gruppen von Signalen: Eine Gruppe kann vom Prozess ignoriert beziehungsweise abgefangen werden, die andere nicht. Der Adressat dieser Signale ist viel eher der Kernel, der mit einer bestimmten Aktion gegenüber dem Empfängerprozess reagieren soll. Dies verdeutlichen die folgenden Beispiele:

  • Signal 9, »SIGKILL« oder »KILL«
  • Dieses Signal beendet einen Prozess zwingend durch den Kernel.
  • Signal 19, »SIGSTOP« oder »STOP«
  • Dieses Signal unterbricht die Verarbeitung eines Prozesses, bis er fortgesetzt wird.
  • Signal 18, »SIGCONT« oder »CONT«
  • Dieses Signal setzt einen gestoppten Prozess fort.

Im Folgenden sollen nun noch abfangbare Signale sowie ihre Bedeutung erklärt werden. Die Liste ist natürlich nicht vollständig, da es sehr viel mehr als nur die hier genannten Signale gibt. Die wichtigsten Signale können dabei wie folgt zusammengefasst werden:

  • Signal 1, »SIGHUP« oder »HUP«
  • Der Prozess soll sich selbst beenden und neu starten. Dieses Signal wird oftmals benutzt, um Dämonprozesse neu zu starten, damit diese ihre Konfigurationsdaten neu einlesen.
  • Signal 14, »SIGALRM« oder »ALARM«
  • Dieses Signal meldet den Ablauf eines Timers, den ein Programmierer mit dem Syscall alarm() starten kann.
  • Signal 15, »SIGTERM« oder »TERM«
  • Dieses Signal soll den Prozess dazu bewegen, sich freiwillig zu beenden. Wenn der Computer heruntergefahren wird, sendet der Kernel allen Prozessen solch ein Signal. Daraufhin haben die Prozesse einige Sekunden Zeit, sich zu beenden und beispielsweise Konfigurationsdaten zu speichern, bevor letztendlich das SIGKILL-Signal an alle Prozesse gesendet wird. <Hierbei sollten Sie beachten, dass nicht alle Prozesse auf das SIGTERM-Signal reagieren. Es liegt im Ermessen des Softwareentwicklers, ob eine entsprechende Signalbehandlungsroutine im Quellcode implementiert wird.>

Aus den Shell-Kapiteln wissen Sie bereits, dass einige Shells (z. B. die bash) ihre eigenen Implementierungen des kill-Kommandos als Builtin mitbringen. Diese Implementierungen bieten vereinzelt weitere Signaltypen. Die bash zum Beispiel unterstützt über 60 verschiedene Signale.

Eine Liste der von Ihrem kill unterstützten Signale bekommen Sie durch den Aufruf von kill -l. Das Linux-kill-Kommando kennt darüber hinaus den -L-Parameter für eine tabellarische Ausgabe.


Galileo Computing

24.3.4 Die Rechte  downtop

Natürlich darf nicht jeder Benutzer fremden Prozessen einfach durch Signale mehr oder weniger durch die Blume mitteilen, dass sie doch bitte die wertvolle Rechenzeit freigeben und sich lieber beenden sollen.

Dazu muss schon wenigstens die reale oder effektive Benutzer-ID des sendenden Prozesses mit der realen oder gespeicherten Benutzer-ID des Zielprozesses übereinstimmen.

Somit wird gewährleistet, dass ein Benutzer jeweils nur eigene Prozesse abschießen kann – außer natürlich, es handelt sich um root, der ja bekanntlich alles darf.


Galileo Computing

24.3.5 In der Praxis: Signale empfangen  toptop

Im Folgenden sollen noch einmal alle Fakten zu einem abschließenden Beispiel zusammengefügt werden. Dazu betrachten wir den folgenden Code, der ein Callback »handler()« zur Behandlung eines Signals über den Syscall signal() beim Kernel registriert:

#include <signal.h> 
#include <stdio.h> 
 
static int x = 0; 
 
void handler(int i) 
{ 
  printf("Signal empfangen: %i", i); 
  x = 1; 
  return; 
} 
 
int main(int argc, char* argv[]) 
{ 
  typedef void (*sighandler_t)(int); 
 
  signal(SIGALRM, &handler); 
 
  while(x == 0) {}; 
  return 0; 
}

Listing 24.16    Ein Callback für SIGALRM

Dem Syscall signal() übergibt man also das abzufangende Signal sowie die Adresse der Funktion, die das Signal behandeln soll. Diese Funktion darf nichts zurückgeben – sie ist vom Typ »void« – und bekommt als Argument die Nummer des empfangenen Signals übergeben. Das ist insofern sinnvoll, als man mit diesem Argument bei einem Handler für mehrere Signale recht einfach überprüfen kann, was man denn da gerade empfangen hat.

Trifft nun ein Signal ein, wird der Prozess vom Kernel nicht mehr an der alten Stelle – in diesem Fall in der leeren Schleife – fortgesetzt. Stattdessen wird die Funktion handler() aufgerufen, die die Variable x auf 1 setzt. Nach dem Ende der Funktion wird das Programm an der vorherigen Stelle fortgesetzt. Da das Programm in der Schleife unterbrochen wurde, wird es auch dort fortgesetzt – allerdings ist die Abbruchbedingung jetzt erfüllt, und der ganze Prozess kann beendet werden. Die Funktionalität kann man wie folgt testen:

$ gcc -o test test.c 
$ ./test & 
[1] 9172 
$ kill -SIGALRM %1 
$ Signal empfangen: 14 
[1]+  Exit 1                  ./test

Listing 24.17    Das Beispiel ausprobieren

Dabei wird der Sourcecode zuerst kompiliert und anschließend mit dem Ampersand (&) als Hintergrundprozess gestartet.

In diesem Augenblick durchläuft das Programm immer wieder die leere Schleife. Erst, nachdem wir diesem Job das SIGALRM-Signal geschickt haben, gibt es die Meldung samt der Signalnummer auf die Konsole aus und beendet sich dann, da die Variable x auf 1 gesetzt wurde und somit das Abbruchkriterium für die Schleife erfüllt ist.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






 <<   zurück
  
  Zum Katalog
Zum Katalog: Linux






 Linux
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Katalog: Einstieg in Linux






 Einstieg in Linux


Zum Katalog: Debian GNU/Linux






 Debian GNU/Linux


Zum Katalog: Ubuntu GNU/Linux






 Ubuntu GNU/Linux


Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-UNIX-Programmierung






 Linux-UNIX-
 Programmierung


Zum Katalog: Praxisbuch Netzwerk-Sicherheit






 Praxisbuch
 Netzwerk-Sicherheit


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Galileo Press 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de