getrlimit(2) getrlimit(2)
NAME
getrlimit, setrlimit, getrlimit64, setrlimit64 - Einsatz der System-
ressourcen steuern
SYNTAX
#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlp);
int setrlimit(int resource, const struct rlimit *rlp);
int getrlimit64(int resource, struct rlimit64 *rlp);
int setrlimit64(int resource, const struct rlimit64 *rlp);
BESCHREIBUNG
Grenzwerte hinsichtlich des Verbrauchs verschiedener Systemressourcen
durch einen Prozeß und alle seine Sohnprozesse können mit getrlimit()
abgerufen und mit setrlimit() gesetzt werden.
Jeder Aufruf von getrlimit() oder setrlimit() gibt eine bestimmte Res-
source und einen bestimmten Grenzwert für diese Ressource an. Der
Grenzwert wird durch eine rlimit-Struktur dargestellt. Die Komponente
rlimcur gibt den aktuellen (oder "weichen") Grenzwert an und die Kom-
ponente rlimmax den maximalen (oder "harten") Grenzwert. Weiche
Grenzwerte können von einem Prozeß auf einen Wert gesetzt werden, der
kleiner oder gleich dem harten Grenzwert ist. Ein Prozeß kann seinen
harten Grenzwert auf einen Wert größer oder gleich dem weichen Grenz-
wert verringern (dies läßt sich allerdings nicht mehr rückkgängig
machen). Nur ein Prozeß mit entsprechender Berechtigung kann einen
harten Grenzwert erhöhen. Sowohl harter als auch weicher Grenzwert
können durch einen einzigen Aufruf von setrlimit() unter Berücksichti-
gung der oben beschriebenen Einschränkungen verändert werden.
Der in <sys/resource.h> definierte Wert RLIMINFINITY ist größer als
jeder andere Grenzwert. Wenn ein Aufruf getrlimit() den Wert
RLIMINFINITY für eine Systemressource zurückgibt, bedeutet dies, daß
die Implementierung keine Grenzwerte für diese Ressource erzwingt.
Wird RLIMINFINITY in einem erfolgreichen Aufruf von setrlimit() als
Grenzwert einer Systemressource angegeben, wird die Anwendung dieses
Grenzwerts unterdrückt.
Kann bei Verwendung der Funktion getrlimit() ein Ressourcengrenzwert
in einem Objekt des Typs rlimt korrekt dargestellt werden, so wird
diese Darstellung zurückgeliefert. Wenn jedoch der Wert der Ressour-
cengrenze dem Wert des zugehörigen gesicherten harten Grenzwerts (hard
limit) entspricht, ist der zurückgelieferte Wert RLIMSAVEDMAX.
Ansonsten wird der Wert RLIMSAVEDCUR zurückgeliefert.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
getrlimit(2) getrlimit(2)
Lautet bei Verwendung der Funktion setrlimit() der angeforderte neue
Grenzwert RLIMINFINITY, so ist der neue Grenzwert "no limit" (also
kein Grenzwert); wenn der angeforderte Grenzwert RLIMSAVEDMAX lau-
tet, entspricht der neue Grenzwert dem zugehörigen gesicherten harten
Grenzwert (hard limit). Wenn der angeforderte neue Grenzwert
RLIMSAVEDCUR lautet, entspricht der neue Grenzwert dem zugehörigen
gesicherten weichen Grenzwert (soft limit). Ansonsten entspricht der
neue Grenzwert dem angeforderten Wert. Außerdem wird der entsprechende
gesicherte Grenzwert, wenn er in einem Objekt des Typs rlimt korrekt
dargestellt werden kann, durch den neuen Grenzwert überschrieben.
Wenn ein Grenzwert auf RLIMSAVEDMAX oder RLIMSAVEDCUR gesetzt
wird, ist das Ergebnis unbestimmt, es sei denn, ein vorheriger Aufruf
von getrlimit() hat diesen Wert als weichen oder harten Grenzwert für
den entsprechenden Ressourcengrenzwert zurückgegeben.
Ob ein Grenzwert in einem Objekt des Typs rlimt korrekt dargestellt
werden kann, hängt von der jeweiligen Implementierung ab. So lassen
zum Beispiel einige Implementierungen einen Grenzwert zu, der höher
als RLIMINFINITY ist, andere dagegen nicht.
Bei der Gruppe der exec-Funktionen werden Ressourcengrenzwerte außer-
dem gesichert [siehe exec(2)].
Es besteht kein funktionaler Unterschied zwischen
getrlimit()/setrlimit() und getrlimit64()/setrlimit64(), außer bei der
Interpretation von rlimit/rlimit64 [siehe resource(5)].
Die folgenden Ressourcen sind definiert:
RLIMITCORE Die maximale Größe einer Speicherabzugsdatei (in
Bytes), die von einem Prozeß erstellt werden kann. Bei
einem Grenzwert von 0 wird die Erstellung einer Spei-
cherabzugsdatei verhindert. Das Schreiben der Datei
wird beendet, sobald dieser Grenzwert überschritten
wird.
RLIMITCPU Die vom Prozeß verwendete maximale CPU-Zeit in Sekun-
den. Wenn dieser Grenzwert überschritten wird, wird
für den Prozeß ein SIGXCPU-Signal ausgegeben. Wird das
SIGXCPU-Signal vom Prozeß blockiert, abgefangen oder
ignoriert, ist das Verhalten unbestimmt.
RLIMITDATA Die maximale Größe für Datensegmente des Prozesses in
Bytes. Wird dieser Grenzwert überschritten, schlagen
die Funktionen brk(), malloc() und sbrk() fehl, und
errno wird auf ENOMEM gesetzt.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
getrlimit(2) getrlimit(2)
RLIMITFSIZE Die maximale Größe einer Datei (in Bytes), die von
einem Prozeß erstellt werden kann. Bei einem Grenzwert
von 0 wird die Erstellung einer Datei verhindet. Wenn
dieser Grenzwert durch einen Schreibvorgang oder durch
Abschneiden überschritten würde, wird ein SIGXFSZ-Sig-
nal für den Prozeß erzeugt. Wird das SIGXFSZ-Signal
vom Prozeß blockiert, abgefangen oder ignoriert,
schlagen weitere Versuche, die Datei über das Datei-
ende und diesen Grenzwert hinaus zu vergrößern, fehl,
und errno wird auf EFBIG gesetzt.
RLIMITNOFILE Eine Nummer, die um eins größer als der Maximalwert
ist, die das System einem neuerstellten Deskriptor
zuordnen kann. Wird dieser Grenzwert überschritten,
können Funktionen, die neue Dateideskriptoren zuord-
nen, fehlschlagen, wobei errno auf EMFILE gesetzt
wird. Über diesen Grenzwert wird die Anzahl der Datei-
deskriptoren eingeschränkt, die von einem Prozeß
zugeordnet werden können.
RLIMITSTACK Die maximale Größe für den Stack eines Prozesses in
Bytes. Die Implementierung vergrößert den Stack nicht
automatisch über diesen Grenzwert hinaus. Wird der
Grenzwert überschritten, wird ein SIGSEGV-Signal für
den Prozeß erzeugt. Wenn der Prozeß das SIGSEGV-Signal
blockiert, ignoriert oder abfängt, und keine Vorkeh-
rungen zur Verwendung eines anderen Stacks getroffen
wurden, wird die Voreinstellung des Signals SIGSEGV
vor seiner Erzeugung auf SIGDFL gesetzt.
RLIMITAS oder RLIMITVMEM
Die maximale Speichergröße in Bytes, die für einen
Prozeß insgesamt verfügbar ist. Wird dieser Grenzwert
überschritten, schlagen die Funktionen brk(),
malloc(), mmap() und sbrk() fehl, und errno wird auf
ENOMEM gesetzt. Außerdem schlägt das automatische
Anwachsen des Stacks mit den oben beschriebenen Aus-
wirkungen fehl.
Da Grenzwertinformationen auf Prozeßbasis verwaltet werden, muß die
Shell-Anweisung ulimit(1) diesen Systemaufruf direkt ausführen, damit
sich die Funktion auch auf alle zukünftigen von der Shell erzeugten
Prozesse auswirkt.
RÜCKGABEWERT
Bei erfolgreicher Ausführung geben getrlimit() und setrlimit() den
Wert 0 zurück. Andernfalls wird -1 zurückgegeben und errno zur Anzeige
des Fehlers gesetzt.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
getrlimit(2) getrlimit(2)
FEHLER
Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
errno(5).
Unter den folgenden Bedingungen schlagen die Funktionen getrlimit()
und setrlimit() fehl und setzen errno auf den jeweils angegeben Wert:
EINVAL Eine ungültige resource wurde angegeben, oder in einem
setrlimit()-Aufruf überschreitet der neue rlimcur-Wert den
neuen rlimmax Wert.
EPERM Durch den für setrlimit() angegebenen Grenzwert würde der
maximale Grenzwert erhöht, der aufrufende Prozeß verfügt
jedoch nicht über die entsprechende Berechtigung hierzu.
Die Funktion setrlimit() kann bei folgender Bedingung fehlschlagen:
EINVAL Der angegebene Grenzwert kann nicht herabgesetzt werden, da
die aktuelle Auslastung bereits über dem Grenzwert liegt.
HINWEISE
Wenn ein Prozeß versucht, einen harten oder weichen Grenzwert für
RLIMITNOFILE auf einen Wert unter dem in <limits.h> angegebenen Wert
von POSIXOPENMAX zu setzen, kann dies zu unerwarteten Ergebnissen
führen.
Diese Funktionen bilden Grenzwerte, die sie nicht korrekt darstellen
können auf und von RLIMSAVEDMAX und RLIMSAVEDCUR ab. Diese Werte
müssen von Programmen nicht auf besondere Weise bearbeitet werden. Sie
können auch als Token betrachtet werden, die der Kernel an Programme
ausgibt, die die tatsächliche Antwort nicht verarbeiten können, und
die den Kernel daran erinnern, welcher Wert in Wirklichkeit gemeint
ist, wenn die Token vom Benutzer zurückkommen.
Wenn setrlimit() aus irgendeinem Grund fehlschlägt (zum Beispiel
EPERM), bleiben die Ressourcengrenzwerte und die gesicherten Ressour-
cengrenzwerte unverändert.
Nur wenige Programme (wenn überhaupt) müssen explizit auf
RLIMSAVEDMAX oder RLIMSAVEDCUR verweisen. Programme, die auf diese
Grenzwerte verweisen, sollten diese nicht in Switch-Case-Anweisungen
der Sprache C verwenden, da sie in einigen Implementierungen mögli-
cherweise denselben Wert aufweisen können.
Ein Grenzwert, der in einem Objekt des Typs rlimt korrekt dargestellt
werden kann, ist entweder "kein Grenzwert" (no limit), der mit
RLIMINFINITY dargestellt wird, oder er hat einen Wert ungleich
RLIMINFINITY, RLIMSAVEDMAX oder RLIMSAVEDCUR, kann in einem
Objekt des Typs rlimt korrekt dargestellt werden und erfüllt alle
zusätzlichen implementierungsspezifischen Kriterien für eine korrekte
Darstellung.
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
getrlimit(2) getrlimit(2)
SIEHE AUCH
ulimit(1), brk(2), exec(2), fork(2), open(2), sigaltstack(2),
ulimit(2), getdtablesize(3), malloc(3C), sysconf(3C), lfs(5),
resource(5), signal(5), stropts(5).
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98