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

 << zurück
Linux-UNIX-Programmierung von Jürgen Wolf
Das umfassende Handbuch – 2., aktualisierte und erweiterte Auflage 2006
Buch: Linux-UNIX-Programmierung

Linux-UNIX-Programmierung
1216 S., mit CD, 49,90 Euro
Rheinwerk Computing
ISBN 3-89842-749-8
gp Kapitel 7 Dämonen, Zombies und Prozesse
  gp 7.1 Was ist ein Prozess?
  gp 7.2 Prozesskomponente
    gp 7.2.1 Prozessnummer (PID)
    gp 7.2.2 Prozessnummer des Vaterprozesses (PPID)
    gp 7.2.3 Benutzer- und Gruppennummer eines Prozesses (UID, EUID, GID, EGID)
    gp 7.2.4 Prozessstatus
    gp 7.2.5 Prozesspriorität
    gp 7.2.6 Timesharing-Prozesse
    gp 7.2.7 Prozessauslagerung
    gp 7.2.8 Steuerterminal
  gp 7.3 Prozesse überwachen – ps, top, kpm
  gp 7.4 Lebenszyklus eines Prozesses
  gp 7.5 Umgebungsvariablen eines Prozesses
    gp 7.5.1 Einzelne Umgebungsvariablen abfragen
    gp 7.5.2 Umgebungsvariable verändern oder hinzufügen – putenv() und setenv()
    gp 7.5.3 Löschen von Umgebungsvariablen – unsetenv() und clearenv()
  gp 7.6 Ressourcenlimits eines Prozesses
    gp 7.6.1 Mehr Sicherheit mit Ressourcenlimits
  gp 7.7 Prozesserkennung
  gp 7.8 Erzeugung von Prozessen – fork()
    gp 7.8.1 Pufferung
    gp 7.8.2 Was wird vererbt und was nicht?
    gp 7.8.3 Einen Prozess mit veränderter Priorität erzeugen
  gp 7.9 Warten auf einen Prozess
  gp 7.10 Die exec-Familie
    gp 7.10.1 execl()
    gp 7.10.2 execve()
    gp 7.10.3 execv()
    gp 7.10.4 execle()
    gp 7.10.5 execlp()
    gp 7.10.6 execvp()
    gp 7.10.7 Kindprozesse mit exec-Aufruf überlagern
  gp 7.11 Kommandoaufrufe aus dem Programm – system()
  gp 7.12 Dämonprozesse
    gp 7.12.1 Wie ein Prozess zum Dämon wird ...
    gp 7.12.2 Dämon, sprich mit uns ...
    gp 7.12.3 Protokollieren von Dämonen – syslog()
    gp 7.12.4 syslog() in der Praxis
    gp 7.12.5 Den Dämon, den ich rief ...
  gp 7.13 Rund um die Ausführung von Prozessen
    gp 7.13.1 Einen Dämon beim Booten mit einem init-Skript starten
    gp 7.13.2 Hintergrundprozesse und Jobkontrolle
    gp 7.13.3 Prozesse zeitgesteuert ausführen (cron-Jobs)
  gp 7.14 Zusammenfassung und Ausblick


Rheinwerk Computing

7.6 Ressourcenlimits eines Prozesses  downtop

Wenn ein Prozess an ein bestimmtes Limit stößt, wird in der Regel ein Signal gesendet, oder der Systemaufruf, der versucht, ein Limit zu überschreiten, schlägt fehl. Jeder neu erzeugte oder aufgerufene Prozess erbt seine Limitwerte vom Elternprozess. Dieser Mechanismus wird bereitgestellt, um Prozesse mit gezielten Beschränkungen bezüglich ihres Ressourcenverbrauchs belegen zu können. Diese Limits lassen sich aber auch verändern. Es werden dabei zwei Arten von Limits unterschieden:

gp  Soft-Limit – aktueller Wert des Ressourcenlimits eines Prozesses
gp  Hard-Limit – maximaler Wert des Ressourcenlimits eines Prozesses

Definiert sind diese beiden Limits in der Struktur rlimit, die folgendermaßen aussieht:

struct rlimit {
   rlim_t rlim_cur; /* Soft-Limit */
   rlim_t rlim_max; /* Hard-Limit */
}

Ist bei der Abfrage der Limits die Konstante RLIM_INFINITY angegeben, so bedeutet dies, dass kein Limit für diese Ressource festgelegt ist. Wenn Sie ein Ressourcenlimit verändern wollen, müssen Sie folgende Regeln beachten:

gp  Ein Hard-Limit kann nur von Prozessen mit Superuser-Rechten hochgesetzt werden, egal ob das Limit zuvor reduziert wurde oder nicht. Für das Heruntersetzen sind hingegen keine Superuser-Rechte nötig.
gp  Beim Verändern des Soft-Limits muss der neue Wert immer kleiner oder gleich dem des Hard-Limits sein.

Ein Ressourcenlimit können Sie mit der Funktion getrlimit() erfragen, verändern können Sie ein Limit mit dem Gegenstück setrlimit(). Hier die Syntax der beiden Funktionen:

#include <sys/resource.h>
#include <sys/time.h>
#include <unistd. h.>
int getrlimit(int ressource, struct rlimit *limit);
int setrlimit(int ressource, const struct rlimit *limit);

Beide Funktionen geben bei Erfolg 0, ansonsten bei einem Fehler ungleich 0 zurück (wie bei so vielen C-Funktionen). Als erstes Argument erwarten diese Funktionen eine entsprechende Ressource, die erfragt bzw. gesetzt werden soll. Das zweite Argument ist ein Zeiger auf die Struktur rlim. Für resource können Sie folgende vordefinierte Konstanten angeben:


Tabelle 7.5    Übersicht der Ressourcenlimits

Ressource Bedeutung vorhanden in …
RLIMIT_CPU CPU-Zeit in Millisekunden. Ist das Limit überschritten, wird das Signal SIGXCPU gesendet. SVR4 und BSD
RLIMIT_CORE Größe der Core-Datei in Bytes. 0 bedeutet, dass keine Core-Datei angelegt wird. SVR4 und BSD
RLIMIT_DATA Größe des gesamten Datensegments (Datensegment, Stack und Heap) in Bytes SVR4 und BSD
RLIMIT_FSIZE Max. Größe einer Datei, die beschrieben werden kann. Beim Überschreiten des Soft-Limits wird das Signal SIGXFSZ gesendet. SVR4 und BSD
RLIMIT_LOCKS Max. Anzahl Sperren, die mit flock() und fcntl() eingerichtet werden können SVR4, BSD und Linux ab 2.4
RLIMIT_MEMLOCK Max. Anzahl der Speicherseiten, die vor einer Auslagerung geschützt werden können Linux und BSD
RLIMIT_NOFILE Max. Anzahl von gleichzeitig geöffneten Dateien. Bei BSD ist dies die Konstante RLIMIT_OFILE. SVR4 (und BSD)
RLIMIT_NPROC Max. Anzahl von Kindprozessen minus 1 für diesen Prozess BSD
RLIMIT_RSS Maximum Resident Set Size (RSS == physikalische Speicherseiten) in KByte. Übersteigt der Prozess dieses Limit, kümmert sich der Kernel darum und nimmt dem Prozess überfälligen Speicher weg. BSD
RLIMIT_STACK Max. Stackgröße in Bytes SVR4 und BSD

Natürlich gilt auch hier, dass eine Veränderung der Ressourcenlimits nur vom Anfang bis zum Ende der Lebenszeit eines Prozesses gilt. Das folgende Listing demonstriert, wie Sie die aktuellen Ressourcenlimits des aktuell laufenden Prozesses mit getrlimit() abfragen können. Da sich setrlimit() ähnlich anwenden lässt, sollte es kein Problem für Sie sein, diese nachträglich als Übung zu implementieren.

/* my_limit.c */
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/resource.h>
static void limits( int resource ) {
   struct rlimit l;   
   
   if( getrlimit( resource, &l ) < 0 ) {
      printf("keine Angaben\n");
      return;
   }
   printf("Soft-Limit: ");
   (l.rlim_cur == RLIM_INFINITY)?
   printf("kein Limit  "):
   printf("%ld  ",l.rlim_cur);
   printf("Hard-Limit: ");
   (l.rlim_max == RLIM_INFINITY)?
   printf("kein Limit\n"):
   printf("%ld  \n",l.rlim_max);
}   
int main( void ) {
   unsigned int i;
   const int limit[] = { 
      RLIMIT_CPU, RLIMIT_CORE, RLIMIT_DATA, RLIMIT_FSIZE,
      /* RLIMIT_LOCKS,*/ RLIMIT_MEMLOCK,
      RLIMIT_NOFILE, /* bei BSD RLIMIT_OFILE */
      RLIMIT_NPROC, RLIMIT_RSS, RLIMIT_STACK,
    };
  const char *s_limit[] = { 
      "RLIMIT_CPU", "RLIMIT_CORE", "RLIMIT_DATA",
      "RLIMIT_FSIZE", /* "RLIMIT_LOCKS",*/ "RLIMIT_MEMLOCK",
      "RLIMIT_NOFILE", /* bei BSD RLIMIT_OFILE */
      "RLIMIT_NPROC", "RLIMIT_RSS", "RLIMIT_STACK",
   };
   for( i = 0; i< sizeof(limit)/sizeof(long); i++) {
      printf("%s = ",s_limit[i]);
      limits( limit[i] );
   }      
    return EXIT_SUCCESS;
}

Das Programm bei der Ausführung (hier im Jail einer BSD-Maschine):

$ gcc -o my_limit my_limit.c
$ ./my_limit
RLIMIT_CPU    = Soft-Limit:kein Limit  Hard-Limit:kein Limit
RLIMIT_CORE   = Soft-Limit:kein Limit  Hard-Limit:kein Limit
RLIMIT_DATA   = Soft-Limit:536870912   Hard-Limit:536870912
RLIMIT_FSIZE  = Soft-Limit:kein Limit  Hard-Limit:kein Limit
RLIMIT_MEMLOCK= Soft-Limit:kein Limit  Hard-Limit:kein Limit
RLIMIT_NOFILE = Soft-Limit:7322        Hard-Limit:7322
RLIMIT_NPROC  = Soft-Limit:3661        Hard-Limit:3661
RLIMIT_RSS    = Soft-Limit:kein Limit  Hard-Limit:kein Limit
RLIMIT_STACK  = Soft-Limit:67108864    Hard-Limit:67108864

Wollen Sie hingegen die Ressourcenbenutzung eines Prozesses abfragen, können Sie sich die Funktion getrusage() ansehen, die ebenfalls in der Headerdatei sys/resource.h definiert ist. Die Funktion stammt ursprünglich aus BSD und ist unter Linux noch nicht komplett implementiert. Viele Komponenten geben noch 0 zurück. Mehr dazu entnehmen Sie bitte der Manual Page zu getrusage().


Rheinwerk Computing

7.6.1 Mehr Sicherheit mit Ressourcenlimits  toptop

Ein weiterer positiver Beigeschmack wird Ihnen beim Setzen der Limits gratis mitgeliefert. Z. B. können durch das Limitieren von Filedeskriptoren und der Memorygröße DoS-Attacken (DoS = Denial of Service) eingedämmt werden. Ebenso kann es in einigen Fällen hilfreich sein, die Größe der Core-Files auf 0 zu setzen, wodurch eventuelle Freigaben von vertraulichen Informationen verhindert werden können, wie dies vor ein paar Jahren bei einem FTP-Dämon auf Solaris der Fall war. Hier hatte der FTP-Server eine Datei zur Authentifizierung eines Benutzers in den Speicher geladen. Hacker hatten dann den Prozess durch Signale zum Absturz gebracht, und es wurde eine Core-Datei mit u. a. dem Inhalt der geschützten Daten angelegt, die jetzt munter ausgelesen werden konnten.

 << zurück
  
  Zum Rheinwerk-Shop
Neuauflage: Linux-UNIX-Programmierung
Neuauflage:
Linux-UNIX-
Programmierung

bestellen
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-
 Programmierung


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
Info





Copyright © Rheinwerk Verlag GmbH 2006
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.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern