Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

getrlimit, getrlimit64, setrlimit, setrlimit64 - Grenzwert für ein Betriebsmittel ermitteln bzw. setzen

&pagelevel(4)&pagelevel

Definition

#include <sys/resource.h>

int getrlimit (int resource, struct rlimit *rlp);
int getrlimit64 (int resource, struct rlimit64 *rlp);
int setrlimit (int resource, const struct rlimit *rlp);
int setrlimit64 (int resource, const struct rlimit64 *rlp);

Beschreibung

Dieser Aufruf limitiert die Benutzung einer Vielzahl von Betriebsmitteln durch einen Prozess und aller seiner Sohnprozesse; mit getrlimit() werden die Grenzwerte gelesen und mit setrlimit() gesetzt.

Jeder Aufruf von getrlimit() oder setrlimit() gibt ein bestimmtes Betriebsmittel resource und einen bestimmten Grenzwert dafür an, auf den rlp verweist. Der Grenzwert setzt sich aus einem Wertepaar zusammen, das in der Struktur rlimit steht. rlp muss ein Zeiger auf eine solche Struktur sein.
rlimit enthält die folgenden Komponenten:

rlim_t rlim_cur;      /* aktueller Grenzwert */

rlim_t rlim_max;      /* maximaler Grenzwert */

rlim_t ist ein arithmetischer Datentyp, in den Objekte des Typs int, size_t und off_t konvertiert werden können, ohne dass Informationen verlorengehen.
rlim_cur gibt den aktuellen oder weichen Grenzwert an, rlim_max den maximalen oder harten Grenzwert. Weiche Grenzwerte können von einem Prozess auf einen Wert gesetzt werden, der kleiner oder gleich dem harten Grenzwert ist. Ein Prozess kann seinen harten Grenzwert verringern (nicht umkehrbar), so dass er größer oder gleich dem weichen Grenzwert wird. Nur ein Prozess mit entsprechender Privilegierung kann einen harten Grenzwert erhöhen. Sowohl harter als auch weicher Grenzwert können durch einen einzigen Aufruf von setrlimit() verändert werden, abhängig von den oben beschriebenen Beschränkungen.

Der Wert RLIM_INFINITY, der in sys/resource.h definiert ist, entspricht einem unendlich großen Grenzwert, d.h. wenn getrlimit() für ein Betriebsmittel RLIM_INFINITY zurückliefert, dann sieht die Implementierung keinen Grenzwert für dieses Betriebsmittel vor. Wird setrlimit() mit RLIM_INFINITY für ein Betriebsmittel erfolgreich ausgeführt, dann wird für dieses Betriebsmittel die Einhaltung eines Grenzwerts nicht mehr abgeprüft.

Kann bei Verwendung der Funktion getrlimit() der Grenzwert für ein Betriebsmittel in einem Objekt des Typs rlimit_t korrekt dargestellt werden, so wird diese Darstellung zurückgeliefert. Entspricht jedoch der Grenzwert dem Wert des zugehörigen, gesicherten harten Grenzwert, ist der zurückgelieferte Wert RLIM_SAVED_MAX. Ansonsten wird der Wert RLIM_SAVED_CUR zurückgeliefert.

Ist bei der Funktion setrlimit() der angeforderte Grenzwert RLIM_INFINITY, so ist kein Wert als neuer Grenzwert vorgesehen. Lautet der angefordete Grenzwert RLIM_SAVED_-MAX, entspricht der neue Grenzwert dem zugehörigen, gesicherten harten Grenzwert. Wird RLIM_SAVED_CUR als Grenzwert angefordert, entspricht der neue Grenzwert dem zugehörigen, gesicherten weichen Grenzwert. Ansonsten entspricht der neue Wert dem angeforderten Wert. Außerdem wird der entsprechende gesicherte Grenzwert, wenn er in einem Objekt des Typs rlim_t korrekt dargestellt werden kann, durch den neuen Grenzwert überschrieben.

Wird ein Grenzwert auf RLIM_SAVED_MAX oder RLIM_SAVED_CUR gesetzt, ist das Ergebnis unbestimmt, es sei denn, ein vorheriger Aufruf von getrlimit() hat diesen Wert als harten oder weichen Grenzwert für den entsprechenden Betriebsmittelgrenzwert zurückgegeben.

Analog gilt dies alles auch für die Funktionen getrlimit64() , setrlimit64() und für die Werte RLIM64_INFINITY , RLIM64_SAVED_MAX und RLIM64_SAVED_CUR .

Die möglichen Betriebsmittel, deren Beschreibungen und die resultierenden Maßnahmen beim Überschreiten eines Grenzwertes werden in der folgenden Tabelle zusammengefasst:

Betriebsmittel

Beschreibung

Maßnahme

RLIMIT_CORE

Die maximale Größe einer Speicherabzugsdatei in Bytes, die von einem Prozess erzeugt werden darf. Eine Größe von 0 verhindert die Erzeugung von Speicherabzugsdateien.

Das Schreiben einer Speicherabzugsdatei wird bei dieser Größe beendet.

RLIMIT_CPU

Die maximale Dauer der CPU-Zeit, die von einem Prozess verbraucht wird.

SIGXCPU wird an den Prozess gesendet.
Wenn der Prozess SIGXCPU blockiert, abfängt oder ignoriert, ist das Verhalten undefiniert.

RLIMIT_DATA

Die maximale Größe des Datensegments eines Prozesses in Bytes. Unter POSIX ist die Größe unbegrenzt, da sbrk(), brk() und  malloc() unabhängigen Speicher verwenden.

brk(), malloc() und sbrk() schlagen fehl, und errno enthält ENOMEM.

RLIMIT_FSIZE

Die maximale Länge einer Datei in Bytes, die von einem Prozess erzeugt werden kann. Eine Länge von 0 verhindert die Erzeugung von Dateien.

SIGXFSZ wird an den Prozess gesendet.
Wenn der Prozess SIGXFSZ blockiert, abfängt oder ignoriert, schlagen weitere Versuche, die Datei zu vergößern fehl, und errno enthält EFBIG.

RLIMIT_NOFILE

Die maximale Anzahl der geöffneten Dateideskriptoren, die ein Prozess besitzen kann.

Funktionen, die neue Dateideskriptoren anlegen, schlagen fehl, und errno enthält EMFILE.

RLIMIT_STACK

Die maximale Größe des Prozess-Stacks in Bytes. Das System lässt den Stack nicht automatisch über diesen Grenzwert hinauswachsen.

SIGSEGV wird an den Prozess gesendet.
Wenn der Prozess SIGSEGV blockiert, ignoriert oder abfängt und keinen alternativen Stack verwendet (siehe sigaltstack()),
wird als Behandlungsmodus von SIGSEGV SIG_DFL gesetzt.

RLIMIT_AS

Die maximale Länge des Adressbereichs eines Prozesses in Bytes.

Die Funktionen brk(), malloc(), mmap() und sbrk() schlagen fehl, und errno enthält ENOMEM. Außerdem kann der Stack nicht mehr anwachsen, und die oben genannten Effekte treten auf.

Da die Grenzwertinformationen für jeden Prozess verwaltet werden, muss die Shell-Anweisung ulimit direkt diesen Systemaufruf ausführen, um alle zukünftigen Prozesse zu beeinflussen, die von der Shell erzeugt werden.

Der Wert des aktuellen Grenzwerts der folgenden Betriebsmittel beeinflusst diese implementierungsabhängigen Konstanten:

Grenzwert

Implementierungsabhängige Konstante

RLIMIT_FSIZE

FCHR_MAX

RLIMIT_NOFILE

OPEN_MAX

Es besteht kein funktionaler Unterschied zwischen getrlimit()/ etrlimit() und getrlimit64()/setrlimit64(), außer dass getrlimit64() und setrlimit64() eine rlimit64-Struktur verwenden.

Die Struktur rlimit64 ist analog zu rlimit definiert:

rlim64_t rlim_cur

rlim64_t rlim_max

Werden Threads verwendet, so wirkt sich die Funktion auf den Prozess oder auf einen Thread wie folgt aus:

  • RLIMIT_CPU: ... Wenn der Prozess das Signal SIGXCPU abfängt oder ignoriert oder alle Threads, die zu diesem Prozess gehören, dieses Signal blockieren, kommt es zu undefiniertem Verhalten.
  • RLIMIT_FSIZE: ..., wird das Signal SIGXFSZ für den Thread generiert. Wenn der Thread das Signal SIGXFSZ blockiert oder der Prozess dieses abfängt bzw. ignoriert, schlagen weitere Versuche, die Datei zu vergrößern, fehl und errno erhält EFBIG.
  • RLIMIT_STACK:..., wird das Signal SIGSEGV für den Thread generiert. Wenn der Thread das Signal SIGSEGV blockiert oder der Prozess dieses abfängt bzw. ignoriert und keinen alternativen Stack verwendet, wird als Behandlungsmodus von SIGSEGV SIG_DFL gesetzt.

Returnwert

0

bei Erfolg.

 

-1

bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen.

Fehler

getrlimit() und setrlimit() schlagen fehl, wenn gilt: 

 

EINVAL

Ein ungültiges Betriebsmittel wurde angegeben, oder bei einem Aufruf von  setrlimit() ist der neue Wert in rlim_cur größer als der in rlim_max.

 

EPERM

Der Grenzwert, der in setrlimit() angegeben ist, würde den maximalen Grenzwert erhöhen, aber der aufrufende Prozess verfügt nicht über die entsprechende Privilegierung.

 

Zusätzlich schlägt setrlimit() fehl, wenn gilt: 

 

EINVAL

Der angegebene Grenzwert kann nicht vermindert werden, da aktuell bereits ein höherer Wert benutzt wird.

Siehe auch

brk(), exec(), fork(), getdtablesize(), malloc(), open(), sigaltstack(), sysconf(), ulimit(), tropts.h, sys/resource.h.