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.