intro_prm2(2) intro_prm2(2)
NAME
introprm2, introprm3, introprm3m - Einführung in die Bibliotheks-
funktionen
BESCHREIBUNG
Hinweise zur Umstellung auf XPG4
Mit der Einführung von XPG4 hat sich das Verhalten von einigen Bibli-
otheksfunktionen etwas verändert. Das kann u. U. zu einem geänderten
Verhalten von bestehenden Programmen und Bibliotheken führen. Um die
daraus entstehenden Probleme möglichst einzuschränken, laufen die
betroffenen Funktionen standardmäßig im XPG3-Modus, sie verhalten sich
also wie bisher. Wenn Sie bei diesen Funktionen die XPG4-Funktionali-
tät verwenden wollen, ist folgendes zu beachten:
- Zum Generieren muß der c89-Compiler [siehe cc(1)] verwendet werden,
der automatisch den XPG4-Modus aktiviert.
- Zur Laufzeit muß die Umgebungsvariable XPGIV in die Umgebung
exportiert werden.
Die folgenden Funktionen verhalten sich in den beiden Übersetzungsmodi
unterschiedlich. Bei den mathematischen Funktionen werden im XPG4-
Modus Eingabe und Ergebnis genauer auf das Auftreten von NaN und Über-
bzw. Unterläufe geprüft, und es werden entsprechende errno-Werte
gesetzt:
acos(), asin(), atan(), atan2(), ceil(), cosh(), erf(), erfc(), exp(),
fabs(), floor(), fprintf(), fscanf(), gamma(), hypot(), j0(), j1(),
jn(), lgamma(), log(), log10(), modf(), nllanginfo(), pow(),
printf(), scanf(), sinh(), sprintf(), sqrt(), sscanf(), strftime(),
sysconf(), system(), y0(), y1(), yn().
Die XPG4-Funktionalität der sigaction-Routine ist nur mit dem neuen
c89-Compiler erreichbar [siehe sigaction(2)].
C-Bibliotheken und Funktionsgruppen
Jede Funktion ist entsprechend der Bibliothek, in der sie vorkommt,
einer Funktionsgruppe zugeordnet, die durch die eingeklammerte Nummer
hinter dem Funktionsnamen signalisiert wird.
Die mit (2), (3C) und (3S) gekennzeichneten Funktionen bilden die C-
Standardbibliothek. Die mit (3E) gekennzeichneten Funktionen bilden
die ELF-Bibliothek, die (3M)-Funktionen bilden die mathematische
Bibliothek. Diese drei Bibliotheken werden unten ausführlicher erläu-
tert.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
Die mit (3G) markierten Funktionen bilden die "Allzweck"-Bibliothek
libgen. Diese Bibliothek ist nicht als gemeinsam nutzbares Objekt
(shared library) implementiert und wird nicht automatisch vom C-Über-
setzungssystem gebunden. Geben Sie beim Aufruf des Compilers -lgen an,
um diese Bibliothek zu binden.
Die mit (3X) gekennzeichneten Funktionen kommen in diversen Spezialbi-
bliotheken vor. Dateien, in denen diese Bibliotheken zu finden sind,
werden in den entsprechenden Abschnitten angegeben.
Die Funktionsdeklarationen finden Sie in den in jedem Abschnitt ange-
gebenen #include-Dateien.
Wenn Sie diese Funktionen, externe Variablen oder Makros neu definie-
ren, werden bei einem Aufruf diese neuen Definitionen verwendet, und
nicht die im System vordefinierten Versionen. Alle anderen Namen kön-
nen neu definiert werden, ohne das Verhalten von anderen Bibliotheks-
funktionen zu beeinflussen. Beachten Sie aber, daß solche neuen Defi-
nitionen Konflikte mit Deklarationen in anderen Include-Dateien verur-
sachen können.
Die Include-Dateien in INCDIR stellen für die meisten der in hier
beschriebenen Funktionen Funktionsprototypen (Funktionsdeklarationen,
die die Typen von Argumenten einschließen) zur Verfügung. Mit Funktions-
prototypen kann der Compiler die korrekte Verwendung dieser Funktionen
im Benutzerprogramm überprüfen. Sie können auch den Programmprüfer lint
verwenden. Er gibt selbst dann Unstimmigkeiten aus, wenn die betreffen-
den Include-Dateien nicht dazugebunden sind. Definitionen für die mit
(2), (3C) und (3S) gekennzeichneten Funktionen werden automatisch über-
prüft. Andere Definitionen können durch die Option -l bei lint einge-
schlossen werden. Zum Beispiel schließt -lm Definitionen für libm ein.
Verwenden Sie daher auf jeden Fall den Programmprüfer lint, wenn Sie
Ihre Programme syntaktisch und semantisch überprüfen wollen.
Die C-Standardbibliothek
Die C-Standardbibliothek, die aus den mit (2), (3C) und (3S) bezeich-
neten Funktionen gebildet wird, wird automatisch vom C-Übersetzungs-
system geladen. Die C-Standardbibliothek ist als gemeinsam nutzbares
Objekt (shared library) mit dem Namen libc.so implementiert und auch
als statische Bibliothek unter dem Namen libc.a verfügbar. Ohne
zusätzliche Angaben in der Compiler-Aufrufzeile werden C-Programme mit
der gemeinsam nutzbaren Version der C-Standardbibliothek gebunden. Um
statisch zu binden, geben Sie in der Compiler-Aufrufzeile die Option
-dn an [siehe cc(1)].
Die ELF-Bibliothek libelf
Mit den Funktionen der ELF-Bibliothek können in einem Programm Objekt-
dateien, Archivdateien und Archivkomponenten, die im ELF-Format (Exe-
cutable and Linking Format) vorliegen, manipuliert werden. Die
Include-Datei libelf.h liefert die Deklaration der Typen und der Funk-
tionen für alle Bibliotheksdienste. Geben Sie beim Aufruf des Compi-
lers -lelf an, um diese Bibliothek zu binden [vgl. elf(3E)].
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
Programme kommunizieren mit vielen der höheren Routinen über einen
sogenannten ELF-Deskriptor. Sobald das Programm beginnt, mit einer
Datei zu arbeiten, erzeugt die Funktion elfbegin() einen ELF-
Deskriptor, über den das Programm die Strukturen und Informationen aus
der Datei manipulieren kann. Diese ELF-Deskriptoren können sowohl zum
Lesen als auch zum Schreiben von Dateien verwendet werden. Nachdem ein
Programm für eine Datei einen ELF-Deskriptor angelegt hat, können zur
Manipulation der einzelnen Dateiabschnitte Abschnittsdeskriptoren
angelegt werden [siehe elfgetscn(3E)]. Abschnitte enthalten den Groß-
teil der relevanten Informationen einer Objektdatei, wie zum Beispiel
Text, Daten, Symboltabelle usw. Ein Abschnittsdeskriptor "gehört"
genauso zu einem bestimmten ELF-Deskriptor, wie ein Abschnitt zu einer
Datei gehört. Die Datendeskriptoren sind wiederum über Abschnittsde-
skriptoren verfügbar; über sie kann das Programm die Informationen aus
einem Abschnitt manipulieren. Ein Datendeskriptor "gehört" zu einem
Abschnittsdeskriptor.
Deskriptoren sind eigene, private Zugriffsstrukturen, mit denen ein
Programm auf eine Datei und deren Inhalte zugreifen kann. Ein Datende-
skriptor ist also mit einem Abschnittsdeskriptor verknüpft, der wiede-
rum mit einem ELF-Deskriptor verbunden ist; der ELF-Deskriptor wiede-
rum ist mit einer Datei verknüpft. Obwohl Deskriptoren nur für das
Programm selbst gültig sind, ermöglichen sie den Zugriff auch auf
gemeinsam nutzbare Daten. Ein Programm, das beispielsweise verschie-
dene Eingabedateien kombiniert und andere Dateien erzeugt oder aktua-
lisiert, kann Datendeskriptoren für einen Eingabeabschnitt und einen
Ausgabeabschnitt anlegen. Um den Ausgabedeskriptor zu aktualisieren,
können dann die über den Eingabedeskriptor verfügbaren Daten wieder-
verwendet werden. Auf diese Weise werden zwar verschiedene Deskripto-
ren verwendet, auf die entsprechenden Daten wird aber gemeinsam zuge-
griffen. Dieser gemeinsame Zugriff vermeidet, daß zuviel Speicherplatz
für getrennte Puffer angelegt wird; ferner steigt der Durchsatz, da
das Kopieren von Daten wegfällt.
Dateiklassen
ELF bietet einen Rahmen zur Definition von Objektdateien, wobei ver-
schiedene Prozessoren und Architekturen unterstützt werden. Ein wich-
tiges Unterscheidungskriterium zwischen Objektdateien ist die Klasse
bzw. die Kapazität der Datei. Die 32-Bit-Klasse unterstützt Architek-
turen, in denen ein 32-Bit-Objekt Adressen, Dateilängen usw. wie folgt
darstellen kann:
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
_________________________________________________
| Name | Zweck |
|______________|_________________________________|
| Elf32Addr | Programmadresse (unsigned) |
|______________|_________________________________|
| Elf32Half | mittelgroße Ganzzahl (unsigned)|
|______________|_________________________________|
| Elf32Off | Datei-Offset (unsigned) |
|______________|_________________________________|
| Elf32Sword | große Ganzzahl mit Vorzeichen |
|______________|_________________________________|
| Elf32Word | große Ganzzahl (unsigned) |
|______________|_________________________________|
| unsigned char| kleine Ganzzahl (unsigned) |
|______________|_________________________________|
Andere Klassen werden bei Bedarf definiert, um größere (oder kleinere)
Maschinen zu unterstützen. Einige Bibliotheksdienste arbeiten nur mit
Datenobjekten von bestimmten Klassen, während andere klassenunabhängig
sind. Um diesen Unterschied hervorzuheben, sind die Namen der Biblio-
theksfunktionen so gewählt, daß ihr Status erkennbar ist. Dies wird
unten näher beschrieben.
Datendarstellung
Zwei parallele Objektmengen realisieren typischerweise eine Umgebung
zum Cross-Compilieren. Eine Menge entspricht dem Dateiinhalt, während
die andere Menge dem tatsächlichen Speicherabbild des Programms ent-
spricht, welches die Datei manipuliert. Die Typdefinitionen, die in
der Include-Datei angegeben sind, arbeiten auf der realen Maschine,
welche eine andere Datencodierung als die Zielmaschine (Längen, Wer-
tigkeit der Bytes, usw.) besitzen kann. Die Speicherobjekte der tat-
sächlichen Maschine sollten mindestens so groß sein wie die Dateiob-
jekte (um Informationsverlusten vorzubeugen), dürfen aber auch größer
sein, wenn dies auf der Host-Maschine naheliegend ist.
Zur Konvertierung zwischen Datei- und Speicherdarstellungen existieren
Umsetzungswerkzeuge. Einige Bibliotheksroutinen konvertieren Daten
automatisch, während andere die Konvertierung dem Programm überlassen.
In jedem Fall müssen Programme, welche Objektdateien erzeugen, Objekte
vom Dateityp in diese Dateien schreiben; Programme, welche Objektda-
teien lesen, gehen entsprechend vor. Siehe elfxlate(3E) und
elffsize(3E) für genauere Informationen.
Programme können Daten explizit umsetzen, wobei Struktur und Semantik
der Objektdatei von ihnen vollständig kontrolliert werden. Wenn das
Programm diese Kontrolle nicht ausüben möchte, bietet die Bibliothek
eine Schnittstelle auf höherem Niveau an, welche viele Details der
Objektdatei versteckt. elfbegin() und andere Funktionen erlauben
einem Programm das Bearbeiten von realen Speichertypen, wobei die Kon-
vertierung zwischen Speicherobjekten und deren Dateiäquivalenten auto-
matisch beim Lesen oder Schreiben einer Objektdatei ausgeführt wird.
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
Elf-Versionen
Objektdateiversionen erlauben die Anpassung von ELF an neue Anforde-
rungen. Drei (unabhängige) Versionen können für ein Programm von
Bedeutung sein. Erstens kennt ein Anwendungsprogramm eine bestimmte
Version durch seine Übersetzung mit bestimmten Include-Dateien. Zwei-
tens wurden bei der Übersetzung der Zugriffsbibliothek bestimmte
Include-Dateien verwendet; sie kontrollieren die Version, die von der
Bibliothek verstanden wird. Drittens enthält die ELF-Objektdatei einen
Wert, der ihre Version bezeichnet; diese wird durch die ELF-Version
bestimmt, die dem Erzeuger der Datei bekannt ist. Im Idealfall stimmen
alle drei Versionen überein, jedoch dürfen sie auch voneinander abwei-
chen.
- Ist eine Programmversion aktueller als die Zugriffsbibliothek, ist
es möglich, daß das Programm Informationen verwendet, die der
Bibliothek unbekannt sind. Übersetzungsroutinen können dann nicht
entsprechend arbeiten, was zu einem undefinierten Verhalten führt.
Dieser Zustand erfordert die Installation einer neuen Bibliothek.
- Die Bibliotheksversion kann aktueller als die des Programms und der
Datei sein. Die Bibliothek verarbeitet alte Versionen; Kompatibili-
tätsprobleme werden in diesem Fall umgangen.
- Schließlich kann eine Dateiversion einen aktuelleren Wert aufwei-
sen, den weder das Programm noch die Bibliothek versteht. Unter
Umständen kann das Programm dann die Datei dennoch bearbeiten,
abhängig davon, ob die Datei Zusatzinformationen enthält und ob
diese Informationen ohne Einbußen ignoriert werden können. Die
sichere Alternative besteht auch hier in der Installation einer
neuen Bibliothek, welche die Version der Datei bearbeiten kann.
Um die Unterschiede zu berücksichtigen, muß ein Programm die Funktion
elfversion() verwenden, um seine Version der Bibliothek mitzuteilen;
dadurch wird die Arbeitsversion für den Prozeß angelegt. Durch diese
Vorgehensweise akzeptiert die Bibliothek Daten vom Programm und kann
Daten für das Programm in korrekter Darstellung angeben. Wenn die
Bibliothek Objektdateien liest, wird zur Interpretation der Daten die
Version der Datei verwendet. Beim Schreiben von Dateien oder beim Kon-
vertieren von Speichertypen, die Dateiäquivalente darstellen, verwen-
det die Bibliothek für die Dateidaten die Arbeitsversion des Pro-
gramms.
Systemdienste
Wie bereits erwähnt, bieten elfbegin() und andere Routinen für ELF-
Dateien eine Schnittstelle auf höherem Niveau; Ein- und Ausgabe werden
für das Anwendungsprogramm ausgeführt. Diese Routinen gehen davon aus,
daß ein Programm ganze Dateien im Speicher halten kann, ohne daß
explizit temporäre Dateien verwendet werden. Beim Lesen einer Datei
bringen die Bibliotheksroutinen die Daten in den Speicher und führen
dann Operationen auf der Speicherkopie der Datei aus. Lesen oder
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
schreiben Programme große Objektdateien nach diesem Ansatz, so muß
dies auf einer Maschine geschehen, die über einen entsprechend großen
virtuellen Adreßraum für den Prozeß verfügt. Wenn die zugrundeliegende
systembedingte maximale Anzahl der geöffneten Dateien überschritten
wird, kann ein Programm elfcntl() verwenden, um alle notwendigen
Daten aus der Datei zu lesen. Danach wird dem Programm erlaubt, den
Dateideskriptor zu schließen und anschließend wieder zu benutzen.
Obwohl die elfbegin()-Schnittstelle für die meisten Programme ausrei-
chend und effizient ist, kann es auch Situationen geben, in denen sie
nicht anwendbar ist. In diesen Fällen kann ein Anwendungsprogramm die
Datenübersetzungsroutine elfxlate() direkt aufrufen. Diese Routinen
führen keine Ein- oder Ausgabe durch; dies bleibt dem Anwendungspro-
gramm überlassen. Durch diese Übernahme eines größeren Aufgabenbe-
reichs kontrolliert ein Anwendungsprogramm sein eigenes Ein-/Ausgabe-
modell.
Bibliotheksnamen
Die im Zusammenhang mit der Bibliothek verwendeten Namen haben fol-
gende Formen:
elfname
Diese klassenunabhängigen Namen führen einen Dienst name für das
Programm aus.
elf32name
Dienstnamen mit einer angegebenen Klasse, wie zum Beispiel 32,
zeigen an, daß sie nur mit der entsprechenden Klasse von Dateien
arbeiten.
ElfType
Datentypen können ebenfalls klassenunabhängig sein und werden
durch Type unterschieden.
Elf32Type
Klassenabhängige Datentypen enthalten einen Klassennamen, wie zum
Beispiel 32.
ELFCCMD
Einige Funktionen erhalten Kommandos, die ihre Aktionen kontrol-
lieren. Diese Werte sind Elemente des Aufzählungstyps ElfCmd;
sie reichen von Null bis ELFCNUM-1.
ELFFFLAG
Einige Funktionen erhalten Optionen, die den Bibliotheksstatus
und/oder die Aktionen kontrollieren. Die Optionen sind Bitmasken,
die auch kombiniert werden können.
Seite 6 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
ELF32FSZTYPE
Solche Konstanten stellen die Größe in Bytes in der Dateidarstel-
lung der grundsätzlichen ELF-Typen für die 32-Bit-Dateiklasse
dar. Siehe elffsize() für weitere Informationen.
ELFKKIND
Die Funktion elfkind() identifiziert KIND (den Typ) der Datei,
die mit dem ELF-Deskriptor verknüpft ist. Diese Werte sind Werte
des Aufzählungstyps ElfKind; sie reichen von Null bis
ELFKNUM-1.
ELFTTYPE
Wenn eine Dienstfunktion, wie zum Beispiel elfxlate(), mit meh-
reren Typen operiert, können Namen dieser Form den gewünschten
Typ TYPE angeben. Beispielsweise wird ELFTEHDR direkt
Elf32Ehdr zugeordnet. Diese Werte sind Elemente des Aufzählungs-
typs ElfType; sie reichen von Null bis ELFTNUM-1.
Die Informationen in den ELF-Include-Dateien sind in allgemeine und
prozessorabhängige Bereiche unterteilt. Ein Programm kann Informatio-
nen über den Prozessor durch das Einbinden der entsprechenden
Include-Datei erhalten: sys/elfNAME.h, wobei NAME dem Prozessornamen
entspricht, wie er im ELF-Dateikopf verwendet wird.
_________________________
| Symbol| Prozessor |
|_______|________________|
| M32 | AT&T WE 32100 |
|_______|________________|
| SPARC | SPARC |
|_______|________________|
| 386 | Intel 80386 |
|_______|________________|
| 486 | Intel 80486 |
|_______|________________|
| 860 | Intel 80860 |
|_______|________________|
| 68K | Motorola 68000|
|_______|________________|
| 88K | Motorola 88000|
|_______|________________|
Andere Prozessoren werden bei Bedarf dieser Tabelle hinzugefügt. Bei-
spielsweise kann ein Programm mit Hilfe der folgenden Programmzeilen
prozessorabhängige Informationen für den Prozessor WE 32100 erhalten:
#include <libelf.h>
#include <sys/elfM32.h>
Ohne das Einbinden von sys/elfM32.h wären nur die allgemeinen ELF-
Informationen für das Programm sichtbar.
Seite 7 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
Die mathematische Bibliothek libm
Deklarationen für die mathematischen Funktionen erhalten Sie, indem
Sie die Include-Datei math.h in Ihren Quelltext einbinden. Dort sind
auch einige allgemein nützliche Konstanten definiert.
Die mathematische Bibliothek wird nicht automatisch vom C-Entwick-
lungssystem dazugebunden. Benutzen Sie beim Compiler-Aufruf die Option
-l, um die oben angegebenen Bibliotheken zu verwenden (-lm).
libm besteht aus einem vollständigen Satz von Routinen mit doppelter
Genauigkeit und einigen Routinen mit einfacher Genauigkeit (gekenn-
zeichnet durch ein nachgestelltes f). Die Routinen mit einfacher
Genauigkeit benötigen weniger Rechenzeit bei einer geringeren Genauig-
keit des Ergebnisses. Einige ausgewählte Routinen sind auf minimale
Laufzeit optimiert. Die optimierten Routinen sind: sin(), cos(),
tan(), atan(), atan2(), exp(), log(), log10(), pow() und sqrt(), sowie
deren Entsprechungen mit einfacher Genauigkeit.
BEGRIFFSERKLÄRUNGEN
In diesem Abschnitt werden einige im folgenden immer wieder verwendete
Begriffe erläutert. Die Begriffe sind alphabetisch sortiert.
Besondere Prozesse
Die Prozesse mit den Prozeßnummern 0 und 1 sind Sonderprozesse, sie
werden als proc0 und proc1 bezeichnet [siehe auch kill(2)]. proc0 ist
der Prozeß-Scheduler. proc1 ist der Initialisierungsprozeß (init).
proc1 ist der Ur-Vaterprozeß jedes anderen Prozesses im System und
wird zur Steuerung der Prozeßstruktur verwendet.
Bezeichner für gemeinsam benutzten Speicher
Ein Bezeichner für gemeinsam benutzten Speicher (shmid - shared memory
identifier) ist eine positive, ganze Zahl, die von einem Systemaufruf
shmget bereitgestellt wird. Jeder shmid repräsentiert ein Speicherseg-
ment (das als gemeinsam benutztes Speichersegment bezeichnet wird) und
eine zugehörige Datenstruktur. Es ist zu beachten, daß diese gemeinsam
benutzten Speichersegmente durch den Benutzer explizit entfernt werden
müssen, nachdem der letzte Verweis in diese gelöscht worden ist. Die
Datenstruktur wird mit shmidds bezeichnet und enthält folgende Ele-
mente:
struct ipcperm shmperm; /* Struktur für Zugriffsrechte der
Operationen */
int shmsegsz; /* Größe des Segments */
struct anon-map *shmamp; /* Zeiger auf Bereichsstruktur */
ushort shmlkcnt; /* Anzahl der gleichzeitigen Sperren */
pidt shmlpid; /* Prozeßnummer der letzten Operation */
pidt shmcpid; /* Prozeßnummer des Erstellers */
ulong shmnattch; /* Anzahl der aktuellen Anschlüsse */
ulong shmcnattch; /* Verwendung nur für shminfo */
Seite 8 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
timet shmatime; /* Zeitpunkt des letzten Anschlusses */
long shmpad1; /* reserviert */
timet shmdtime; /* Zeitpunkt der letzten Trennung */
long shmpad2; /* reserviert */
timet shmctime; /* Zeitpunkt der letzten Änderung */
/* Zeiten gemessen in Sekunden seit */
/* 00:00:00 GMT, 1. Januar 1970 */
long shmpad3; /* reserviert */
long shmpad4[4]; /* reserviert */
Es folgt eine Beschreibung der einzelnen Felder der shmidds-Struktur:
shmperm Ist eine ipcperm-Struktur zur Beschreibung der Zugriffs-
rechte für die Operationen auf dem gemeinsam benutzten
Speicher (siehe unten). Diese Struktur besteht aus folgen-
den Elementen:
uidt cuid; /* Benutzernummer des Erstellers */
gidt cgid; /* Gruppennummer des Erstellers */
uidt uid; /* Benutzernummer */
gidt gid; /* Gruppennummer */
modet mode; /* Schreib-/Lese-Erlaubnis */
ulong seq; /* Abfolgenummer für Platzbenutzung */
keyt key; /* Schlüssel */
long pad[4]; /* reserviert */
shmsegsz die Größe des gemeinsam benutzten Speichersegments in
Bytes.
shmcpid die Prozeßnummer des Prozesses, der den Bezeichner des
gemeinsam benutzten Speichers bereitgestellt hat.
shmlpid Prozeßnummer des letzten Prozesses, der eine shmop-
Operation ausgeführt hat.
shmnattch Anzahl der Prozesse, die mit diesem Segment momentan ver-
bunden sind.
shmatime Zeitpunkt der letzten shmat-Operation [siehe auch
shmop(2)].
shmdtime Zeitpunkt der letzten shmdt-Operation [siehe auch
shmop(2)].
shmctime Zeitpunkt der letzten shmctl-Operation, bei der eines der
Elemente der obigen Struktur geändert wurde.
Seite 9 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
Bezeichner für Nachrichten-Warteschlange
Der Bezeichner einer Nachrichten-Warteschlange (msqid) ist eine posi-
tive ganze Zahl, die von einem Systemaufruf msgget() zurückgeliefert
wird. Jede msqid hat eine zugehörige Nachrichten-Warteschlange und
eine Datenstruktur. Die Datenstruktur wird als msqidds bezeichnet und
enthält folgende Teile:
struct ipcperm msgperm;
struct msg *msgfirst;
struct msg *msglast;
ulong msgcbytes;
ulong msgqnum;
ulong msgqbytes;
pidt msglspid;
pidt msglrpid;
timet msgstime;
long msgpad1; /* reserviert */
timet msgrtime;
long msgpad2; /* reserviert */
timet msgctime;
long msgpad3; /* reserviert */
long msgpad4[4]; /* reserviert */
Es folgt eine Beschreibung der Komponenten der msgidds-Struktur:
msgperm Ist eine ipcperm-Struktur, die die Rechte für den Nach-
richtenbetrieb (siehe unten) angibt. Diese Struktur weist
folgende Elemente auf:
uidt cuid; /* Benutzernummer des Erstellers */
gidt cgid; /* Gruppennummer des Erstellers */
uidt uid; /* Benutzernummer */
gidt gid; /* Gruppennummer */
modet mode; /* Schreib-/Lese-Erlaubnis */
ulong seq; /* Belegungsliste der Einträge */
keyt key; /* Schlüssel */
long pad[4]; /* reserviert */
*msgfirst Zeiger auf die erste Nachricht in der Warteschlange.
*msglast Zeiger auf die letzte Nachricht in der Warteschlange.
msgcbytes aktuelle Anzahl der Bytes in der Warteschlange.
msgqnum Anzahl der sich zum jeweiligen Zeitpunkt in der Warte-
schlange befindenden Nachrichten.
msgqbytes Höchstzahl der in einer Warteschlange zugelassenen Bytes.
msglspid Prozeßnummer des letzten Prozesses, der eine msgsnd-
Operation ausgeführt hat.
Seite 10 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
msglrpid Prozeßnummer des letzten Prozesses, der eine msgrcv-
Operation ausgeführt hat.
msgstime Zeitpunkt der letzten msgsnd-Operation.
msgrtime Zeitpunkt der letzten msgrcv-Operation.
msgctime Zeitpunkt der letzten msgctl-Operation, die eines der Ele-
mente der obigen Struktur geändert hat.
Dateideskriptor
Ein Dateideskriptor ist eine kleine, ganze Zahl, die zur Ausführung
von E/A-Operationen auf einer Datei verwendet wird. Der Wert eines
Dateideskriptors liegt im Bereich von 0 bis (NOFILES-1). Ein Prozeß
darf gleichzeitig nicht mehr als NOFILES Dateideskriptoren geöffnet
haben. Ein Dateideskriptor wird von Systemaufrufen, wie z. B. open()
oder pipe() als Ergebnis zurückgegeben. Dateideskriptoren werden als
Argument in Funktionen wie read(), write(), ioctl() und close() ver-
wendet.
Dateiname
Dateinamen bestehen aus 1 bis NAMEMAX Zeichen. Sie können zur
Bezeichnung einer normalen Datei, einer Gerätedatei oder eines Ver-
zeichnisses dienen.
Diese Zeichen können aus dem Satz aller Zeichenwerte mit Ausnahme von
\0 (Null) und dem ASCII-Code für / (Schrägstrich) ausgewählt werden.
Bitte beachten Sie, daß im Normalfall die Zeichen * , ?, [ oder ]
nicht als Teil von Dateinamen verwendet werden sollten, weil die Shell
diesen Zeichen jeweils eine besondere Bedeutung zumißt [siehe sh(1)].
Auch die Verwendung nicht druckbarer Zeichen in Dateinamen sollte ver-
mieden werden.
Ein Dateiname wird manchmal als Komponente eines Pfadnamens verwendet.
Die Interpretation einer Komponente eines Pfadnamens ist abhängig von
dem Wert von NAMEMAX, angewendet auf den Präfix einer solchen Kompo-
nente. Wenn irgendeine Komponente länger als NAMEMAX Zeichen ist,
sollte dies als Fehlerbedingung angesehen werden. Andernfalls sollte
die Implementierung die ersten NAMEMAX Bytes der Komponente des Pfad-
namens verwenden.
Dateizugriffsrechte
Die Erlaubnis zum Lesen, Schreiben und Ausführen/Durchsuchen einer
Datei wird einem Prozeß erteilt, wenn einer oder mehrere der nachste-
henden Punkte erfüllt sind:
- Die effektive Benutzernummer des Prozesses ist die des Systemver-
walters.
Seite 11 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
- Die effektive Benutzernummer des Prozesses entspricht der Benutzer-
nummer des Eigentümers der Datei, und das entsprechende Zugriffsbit
des "Eigentümer"-Teils (0700) des Dateimodus ist gesetzt.
- Die effektive Benutzernummer des Prozesses entspricht nicht der
Benutzernummer des Eigentümers der Datei, aber die effektive Grup-
pennummer des Prozesses entspricht der Dateigruppe, und das ent-
sprechende Zugriffsbit des "Gruppen"-Teils (0070) des Dateimodus
ist gesetzt.
- Die effektive Benutzernummer des Prozesses entspricht nicht der
Benutzernummer des Eigentümers der Datei, die effektive Gruppennum-
mer des Prozesses entspricht nicht der Gruppennummer der Datei,
aber das entsprechende Zugriffsbit des "Andere"-Teils (0007) des
Dateimodus ist gesetzt.
Effektive Benutzernummer und effektive Gruppennummer
Ein aktiver Prozeß hat eine effektive Benutzernummer und eine effek-
tive Gruppennummer. Sie dienen zur Bestimmung der Rechte für Dateizu-
griffe (siehe oben). Die effektive Benutzernummer und die effektive
Gruppennummer entsprechen der realen Benutzernummer des Prozesses bzw.
der realen Gruppennummer, wenn der Prozeß oder einer seiner Vorgänger
nicht aus einer Datei entstanden ist, bei der das s-Bit (das Bit für
die Benutzereinstellung oder für die Gruppennummerneinstellung)
gesetzt wurde [siehe auch exec(2)].
Hintergrund-Prozeßgruppe
Jede Prozeßgruppe, die keine Vordergrund-Prozeßgruppe mit einer Ver-
bindung zu einem steuernden Terminal ist.
Lebensdauer eines Prozesses
Die Lebensdauer eines Prozesses beginnt mit seiner Erzeugung durch
fork() und endet mit seinem Ende mit exit(), sobald seine Beendigung
durch seinen Vaterprozeß bestätigt wurde. Siehe dazu auch wait(2).
Lebensdauer einer Prozeßgruppe
Die Lebensdauer einer Prozeßgruppe beginnt mit ihrer Erzeugung durch
ihren Prozeßgruppenleiter und endet mit dem Ende der Lebensdauer des
letzten Prozesses der Prozeßgruppe, oder wenn der letzte Prozeß die
Gruppe verläßt.
Lebensdauer einer Sitzung
Die Lebensdauer einer Sitzung beginnt mit der Erzeugung der Sitzung
durch den Anmeldeprozeß und endet mit dem Ende der Lebensdauer des
letzten Prozesses der Sitzung, oder wenn der letzte Prozeß die Sitzung
verläßt.
Seite 12 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
Lese-Warteschlange
Die Nachrichten-Warteschlange in einem Modul oder einem Treiber eines
Streams, die Nachrichten enthält, die sich stream-aufwärts bewegen.
Modul
Ein Modul ist eine Einheit, die Verarbeitungsroutinen für Eingabe- und
Ausgabedaten enthält. Es existiert immer in der Mitte eines Streams
zwischen dem Kopf des Streams und einem Treiber. Ein Modul ist das
STREAMS-Gegenstück zu den Kommandos in einer Shell-Pipeline, wobei ein
Modul jedoch ein Funktionspaar enthält, das einen unabhängigen bidi-
rektionalen Datenfluß (stream-abwärts und stream-aufwärts) sowie die
Bearbeitung der Daten ermöglicht.
Multiplexer
Ein Multiplexer ist ein Treiber, der den Anschluß von Streams, die mit
mehreren Benutzerprozessen verbunden sind, an einen einzigen Treiber,
oder den Anschluß von mehreren Treibern an einen einzigen Benutzerpro-
zeß ermöglicht. STREAMS liefert keinen allgemeinen Multiplexer-Trei-
ber, stellt jedoch Einrichtungen für dessen Konstruktion und für den
Anschluß von Stream-Konfigurationen in Multiplexschaltungen zur Verfü-
gung.
Nachricht
Eine oder mehrere Daten- oder Informationsblöcke mit den zugehörigen
STREAMS-Steuerstrukturen in einem Stream. Nachrichten können von ver-
schiedenen definierten Typen sein, die jeweils den Inhalt der Nach-
richt kennzeichnen. Mit Nachrichten werden Kommunikations-Daten inner-
halb eines Streams übertragen.
Nachrichten-Warteschlange
Eine verkettete Liste von Nachrichten in einem Stream, die auf die
Verarbeitung durch ein Modul oder einen Treiber warten.
Pfadname
Ein Pfadname ist eine mit einem Nullzeichen endende Zeichenkette, die
mit einem optionalen Schrägstrich /, beginnt, gefolgt von Null oder
mehr Dateiverzeichnisnamen, die durch Schrägstriche voneinander
getrennt sind. Wahlweise kann danach noch ein Dateiname folgen.
Wenn ein Pfadname mit einem Schrägstrich beginnt, beginnt die Pfadsu-
che beim Root-Verzeichnis. Andernfalls beginnt die Suche beim aktuel-
len Dateiverzeichnis.
Ein alleinstehender Schrägstrich bezeichnet das Root-Dateiverzeichnis.
Seite 13 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
Prozeßgruppe
Jeder Prozeß im System ist Mitglied einer Prozeßgruppe, die durch eine
Prozeßgruppennummer gekennzeichnet ist. Jeder Prozeß, der nicht Pro-
zeßgruppenleiter ist, kann eine neue Prozeßgruppe erzeugen und deren
Leiter werden. Jeder Prozeß, der nicht Prozeßgruppenleiter ist, kann
sich einer existierenden Prozeßgruppe anschließen, die derselben Sit-
zung angehört wie der Prozeß. Ein neu erzeugter Prozeß gehört zu der
Prozeßgruppe seines Vaterprozesses.
Prozeßgruppenleiter
Ein Prozeßgruppenleiter ist jeder Prozeß, dessen Prozeßgruppennummer
gleich seiner Prozeßnummer ist.
Prozeßgruppennummer
Jeder aktive Prozeß ist Mitglied einer Prozeßgruppe, dargestellt durch
eine positive, ganze Zahl, die Prozeßgruppennummer. Diese Nummer ist
die Prozeßnummer des Prozeßgruppenleiters. Mit dieser Gruppierung ist
das Senden von Signalen an zusammengehörige Prozesse möglich [siehe
auch kill(2)].
Prozeßnummer
Jeder aktive Prozeß im System wird eindeutig durch eine positive ganze
Zahl gekennzeichnet, die Prozeßnummer. Eine Prozeßnummer kann durch
das System nicht wieder verwendet werden, bevor nicht die Lebensdauer
des Prozesses, der Prozeßgruppe und der Sitzung für jede Prozeßnummer,
Prozeßgruppe und für jede Sitzungsnummer gleich der fraglichen Prozeß-
nummer beendet ist.
Prozeßnummer des Vaterprozesses
Ein neuer Prozeß wird von einem gegenwärtig aktiven Prozeß erzeugt
[siehe auch fork(2)]. Die Vaterprozeßnummer eines Prozesses ist die
Prozeßnummer des jeweiligen Erzeugers.
Reale Benutzerkennung und reale Gruppenkennung
Jeder am System zugelassene Benutzer wird durch eine postive, ganze
Zahl (0 bis MAXUID) identifiziert, der sogenannten realen Benutzerken-
nung.
Jeder Benutzer ist auch Mitglied einer Gruppe. Die Gruppe wird durch
eine positive ganze Zahl gekennzeichnet, die als reale Gruppennummer
bezeichnet wird.
Ein aktiver Prozeß hat eine reale Benutzernummer und eine reale Grup-
pennummer, die auf die reale Benutzernummer bzw. die reale Gruppennum-
mer des Benutzers gesetzt werden, der für die Erstellung des Prozesses
verantwortlich ist.
Seite 14 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
Root-Dateiverzeichnis und aktuelles Arbeitsverzeichnis
Zu jedem Prozeß gehört das Konzept eines Root-Dateiverzeichnisses und
ein aktuelles Dateiverzeichnis, um Pfadnamen auflösen zu können. Das
Root-Dateiverzeichnis eines Prozesses muß nicht das Root-Dateiver-
zeichnis des Root-Dateisystems sein.
Schreib-Warteschlange
Nachrichten-Warteschlange in einem Modul oder dem Treiber eines
Streams, die Nachrichten enthält, die sich stream-abwärts bewegen.
Semaphor-Bezeichner
Ein Semaphor-Bezeichner (semid) ist eine positive ganze Zahl, die von
einem Systemaufruf semget bereitgestellt wird. Jede semid verfügt über
einen Satz Semaphore und eine damit verbundene Datenstruktur. Die
Datenstruktur wird mit semidds bezeichnet und enthält folgende Ele-
mente:
struct ipcperm semperm; /* Struktur für Zugriffsrechte von
Operationen */
struct sem *sembase; /* Zeiger auf ersten Semaphor im Satz */
ushort semnsems; /* Anzahl der Semaphoren im Satz */
timet semotime; /* Zeitpunkt der letzten Operation */
long sempad1; /* reserviert */
timet semctime; /* Zeitpunkt der letzten Änderung,
Zeiten gemessen in Sekunden
seit 00:00:00 GMT, 1. Jan. 1970 */
long sempad2; /* reserviert */
long sempad3[4]; /* reserviert */
semperm Ist eine ipcperm-Struktur, die die Zugriffsrechte für
Semaphor-Operationen spezifiziert (siehe unten). Diese
Struktur besteht aus folgenden Elementen:
uidt cuid; /* Benutzernummer des Erstellers */
gidt cgid; /* Gruppennummer des Erstellers */
uidt uid; /* Benutzernummer */
gidt gid; /* Gruppennummer */
modet mode; /* Schreib-/Lese-Erlaubnis */
ulong seq; /* Belegungsliste der Einträge */
keyt key; /* Schlüssel */
long pad[4]; /* reserviert */
semnsems Anzahl der Semaphore im Satz. Jeder Semaphor im Satz wird
durch eine positive, ganze Zahl referenziert, die mit
semnum bezeichnet wird. semnum-Werte laufen sequentiell
von 0 bis zum Wert von semnsems minus 1.
semotime Zeitpunkt der letzten semop-Operation.
Seite 15 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
semctime Zeitpunkt der letzten semctl-Operation, mit der ein Ele-
ment der obigen Struktur verändert wurde.
Ein Semaphor ist eine Datenstruktur namens sem und enthält folgende
Elemente:
ushort semval; /* Wert des Semaphors */
pidt sempid; /* pid der letzten Operation */
ushort semncnt; /* # wartend auf semval > cval */
ushort semzcnt; /* # wartend auf semval = 0 */
semval Nicht-negative ganze Zahl, die den aktuellen Wert des
Semaphors darstellt.
sempid Prozeßnummer des letzten Prozesses, der eine Semaphor-
Operation auf diesem Semaphor ausgeführt hat.
semncnt Anzahl der Prozesse, die zum gegebenen Zeitpunkt zurückge-
stellt sind und darauf warten, daß semval dieses Semaphors
größer als der aktuelle Wert wird.
semzcnt Anzahl der Prozesse, die zum gegebenen Zeitpunkt vorüber-
gehend zurückgestellt sind und darauf warten, daß semval
dieses Semaphors gleich Null wird.
Sitzung
Eine Sitzung ist eine Gruppe von Prozessen, die durch eine gemeinsame
Kennung, die Sitzungsnummer, gekennzeichnet ist. Sie ist in der Lage,
eine Verbindung zu einem steuernden Terminal aufzubauen. Jeder Prozeß,
der nicht Prozeßgruppenleiter ist, kann eine neue Sitzung und eine
neue Prozeßgruppe erzeugen und wird deren Sitzungsleiter und Prozeß-
gruppenleiter. Ein neu erzeugter Prozeß gehört zu der Sitzung seines
Erzeugers.
Sitzungsleiter
Ein Sitzungsleiter ist ein Prozeß, dessen Sitzungsnummer gleich seiner
Prozeßnummer und seiner Prozeßgruppennummer ist.
Sitzungsnummer
Jede Sitzung im System wird durch eine positive ganze Zahl gekenn-
zeichnet, die Sitzungsnummer ist gleich der Prozeßnummer des Sitzungs-
leiters.
Steuernder Prozeß
Ein steuernder Prozeß ist ein Sitzungsleiter, der die Verbindung zu
dem steuernden Terminal hergestellt hat.
Seite 16 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
Steuerndes Terminal
Ein Terminal, das mit einer Sitzung verbunden ist. Jede Sitzung muß
mindestens ein steuerndes Terminal zugeordnet haben, und ein steuern-
des Terminal kann maximal einer Sitzung zugeordnet sein. Bestimmte
Eingabefolgen vom steuernden Terminal führen dazu, daß Signale an die
Prozeßgruppe der Sitzung gesendet werden, die dem steuernden Terminal
zugeordnet ist [siehe dazu termio(7)].
STREAMS
Ein Satz von Mechanismen im Systemkern zur Unterstützung der Realisie-
rung der Netzwerkdienste und Datenkommunikations-Treiber. Er definiert
Schnittstellen-Standards für Zeichen-Ein-/Ausgabe innerhalb des
Systemkerns und zwischen dem Systemkern und den Prozessen auf Benutze-
rebene. Der STREAMS-Mechanismus setzt sich aus Dienstprogramm-
Routinen, Systemkern-Einrichtungen und einem Satz von Datenstrukturen
zusammen.
Stream
Ein Stream ist ein Vollduplex-Datenpfad innerhalb des Systemkerns zwi-
schen einem Benutzerprozeß und Treiberroutinen. Die Hauptkomponenten
sind ein Stream-Kopf, ein Treiber und Null oder mehrere Module zwi-
schen dem Stream-Kopf und dem Treiber. Ein Stream entspricht einer
Shell-Pipeline, wobei jedoch Datenfluß und Verarbeitung bidirektional
sind: stream-abwärts bezeichnet die Richtung vom Stream-Kopf zum Trei-
ber, stream-aufwärts bezeichnet die Richtung vom Treiber zum Stream-
Kopf.
Stream-Kopf
In einem Stream bildet der Stream-Kopf jenes Ende des Streams, das die
Schnittstelle zwischen dem Stream und einem Benutzerprozeß darstellt.
Die Hauptfunktionen des Stream-Kopfes bestehen in der Verarbeitung von
STREAMS-bezogenen Systemaufrufen und der Weitergabe von Daten und
Informationen zwischen einem Benutzerprozeß und dem Stream.
Systemverwalter
Ein Prozeß wird als Systemverwalter-Prozeß anerkannt und erhält beson-
dere Privilegien, wie zum Beispiel Unabhängigkeit von den Dateizu-
griffsrechten, wenn die effektive Benutzernummer gleich 0 ist.
Treiber
In einem Stream bildet der Treiber die Schnittstelle zwischen der
peripheren Hardware und dem Stream. Ein Treiber kann auch ein Pseudo-
Treiber sein, wie z. B. ein Multiplexer oder ein Protokoll-Treiber
[siehe auch log(7)], der nicht direkt mit einer Geräteschnittstelle in
Verbindung steht.
Seite 17 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
Verzeichnis
Dateiverzeichnisse organisieren Dateien in ein hierarchisches Dateisy-
stem, wobei die Verzeichnisse die Knoten im System darstellen. In
einem Dateiverzeichnis werden alle Dateien, einschließlich Verzeich-
nissen, die sich direkt unter ihm in der Hierarchie befinden, katalo-
gisiert. Dateiverzeichnis-Einträge werden als Verweise bezeichnet. Ein
Dateiverzeichnis enthält wenigstens zwei Verweise, "." und "..". Der
Verweis "." verweist auf das Dateiverzeichnis selbst, und ".." ver-
weist auf das übergeordnete Dateiverzeichnis. Das Root-Verzeichnis als
oberster Knoten der Hierarchie verweist auf sich selbst als übergeord-
netes Verzeichnis. Der Pfadname des Root-Verzeichnisses ist / und das
übergeordnete Verzeichnis des Root-Verzeichnisses ist /.
Vordergrund-Prozeßgruppe
Jede Sitzung mit einem zugeordneten steuernden Terminal unterscheidet
eine Prozeßgruppe der Sitzung als die Vordergrund-Prozeßgruppe des
steuernden Terminals. Diese Gruppe hat einige Vorrechte bei Zugriffen
auf das steuernde Terminal, die den Hintergrund-Prozeßgruppen unter-
sagt sind.
Zugriffsrechte auf gemeinsam benutzten Speicher
Bei den Systemaufrufen shmop() und shmctl() wird die für eine Opera-
tion benötigte Erlaubnis wie folgt interpretiert:
00400 Lesen durch Benutzer
00200 Schreiben durch Benutzer
00040 Lesen durch Gruppe
00020 Schreiben durch Gruppe
00004 Lesen durch Andere
00002 Schreiben durch Andere
Lese- und Schreiberlaubnis auf einem shmid werden einem Prozeß
gewährt, wenn einer oder mehrere der nachstehenden Punkte gegeben
sind:
- Die effektive Benutzernummer des Prozesses entspricht der des
Systemverwalters.
- Die effektive Benutzernummer des Prozesses entspricht shmperm.cuid
oder shmperm.uid in der Datenstruktur zu shmid, und das entspre-
chende Bit des "Benutzer"-Teils (0600) von shmperm.mode ist
gesetzt.
- Die effektive Gruppennummer des Prozesses entspricht shmperm.cgid
oder shmperm.gid, und das entsprechende Bit des "Gruppe"-Teils
(060) von shmperm.mode ist gesetzt.
- Das entsprechende Bit des "Andere"-Teils (06) von shmperm.mode ist
gesetzt.
Seite 18 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
- Andernfalls wird die entsprechende Erlaubnis verweigert.
Zugriffsrechte für Nachrichten-Warteschlangen
In den Beschreibungen der Systemaufrufe msgop() und msgctl() wird die
für eine Operation erteilte Erlaubnis wie folgt interpretiert:
00400 Lesen durch Benutzer
00200 Schreiben durch Benutzer
00040 Lesen durch Gruppe
00020 Schreiben durch Gruppe
00004 Lesen durch Andere
00002 Schreiben durch Andere
Die Schreib- und Lese-Erlaubnis auf einem msqid werden einem Prozeß
gewährt, wenn einer oder mehrere der nachfolgenden Punkte gegeben
sind:
- Die effektive Benutzernummer des Prozesses ist gleich der des
Systemverwalters.
- Die effektive Benutzernummer des Prozesses ist gleich msgperm.cuid
oder msgperm.uid in der Datenstruktur, die zu msqid gehört, und
das entsprechende Bit des "Benutzer"-Teils (0600) von msgperm.mode
ist gesetzt.
- Die effektive Gruppennummer des Prozesses entspricht msgperm.cgid
oder msgperm.gid, und das entsprechende Bit des "Gruppen"-Teils
(060) von msgperm.mode ist gesetzt.
- Das entsprechende Bit des "Andere"-Teils (006) von msgperm.mode
ist gesetzt.
Andernfalls wird die entsprechende Erlaubnis nicht erteilt.
Zugriffsrechte für Semaphor-Operationen
In der Beschreibung der Systemaufrufe semop() und semctl() wird die
für eine Operation benötigte Erlaubnis wie folgt interpretiert:
00400 Lesen durch Benutzer
00200 Ändern durch Benutzer
00040 Lesen durch Gruppe
00020 Ändern durch Gruppe
00004 Lesen durch Andere
00002 Ändern durch Andere
Die Erlaubnis, lesend und ändernd auf einen semid zuzugreifen, wird
einem Prozeß gewährt, wenn einer oder mehrere der nachstehenden Punkte
gegeben sind:
Seite 19 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
- Die effektive Benutzernummer des Prozesses entspricht der des
Systemverwalters.
- Die effektive Benutzernummer des Prozesses entspricht semperm.cuid
oder semperm.uid in der Datenstruktur zu semid, und das entspre-
chende Bit des "Benutzer"-Teils (0600) von semperm.mode ist
gesetzt.
- Die effektive Gruppennummer des Prozesses entspricht semperm.cgid
oder semperm.gid, und das entsprechende Bit des "Gruppe"-Teils
(060) von semperm.mode ist gesetzt.
- Das entsprechende Bit des "Andere"-Teils (006) von semperm.mode
ist gesetzt.
Andernfalls wird die entsprechende Erlaubnis verweigert.
FEHLERNUMMERN
Bei den meisten der im folgenden beschriebenen Funktionen gibt es
einen oder mehrere Fehlerstatuswerte.
Ein Fehler wird in den meisten Fällen durch einen Rückgabewert ange-
zeigt. Dies ist fast immer der Wert -1 oder der Nullzeiger; Einzelhei-
ten sind in den entsprechenden Beschreibungen zu finden. Zusätzlich
wird eine Fehlernummer in der externen Variablen errno zur Verfügung
gestellt. errno wird bei erfolgreichen Aufrufen nicht zurückgesetzt.
Bei einigen Funktionen kann nur durch Prüfen von errno festgestellt
werden, ob die Funktion erfolgreich war.
Nachstehend wird eine komplette Liste der Fehlernummern und ihrer
Bezeichnungen gegeben, wie sie in errno.h [siehe errno(5)] definiert
sind. Wenn die Bedeutung der Fehlernummer bei einer Funktion von der
hier angegebenen abweicht, ist das bei der Beschreibung der Funktion
angegeben.
1 EPERM
Nicht Eigentümer. Typischerweise tritt dieser Fehler auf, wenn
versucht wurde, eine Datei auf eine Weise zu ändern, die dem
Eigentümer oder Systemverwalter vorbehalten ist. Bei normalen
Benutzern kann dieser Fehler auch auftreten, wenn sie versuchen,
Maßnahmen auszuführen, die dem Systemverwalter vorbehalten sind.
2 ENOENT
Datei oder Dateiverzeichnis unbekannt. Es wurde der Name einer
Datei oder eines Dateiverzeichnisses in einem Pfadnamen verwen-
det, der vorhanden sein sollte, aber nicht vorhanden ist.
3 ESRCH
Prozeß unbekannt. Es kann kein Prozeß gefunden werden, der dem
durch PID in der Routine kill() oder ptrace() angegebenen Prozeß
entspricht.
Seite 20 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
4 EINTR
Unterbrochener Systemaufruf. Ein asynchrones Signal (z. B.
interrupt oder quit), das nicht ignoriert werden soll, ist wäh-
rend eines Systemaufrufs aufgetreten. Bei Wiederaufnahme der Aus-
führung nach Verarbeitung des Signals wird der unterbrochene
Systemaufruf anstelle seines normalen Resultats diesen Fehler
zurückgegeben.
5 EIO
Ein-/Ausgabe-Fehler. Ein physischer Ein-/Ausgabe-Fehler ist auf-
getreten. In einigen Fällen ist es möglich, daß der Fehler erst
bei dem nächsten Systemaufruf auftritt (z. B. kann ein Fehler bei
write() nach close() gemeldet werden).
6 ENXIO
Gerät oder Adresse nicht verfügbar. Eine Ein-/Ausgabe-Operation
verwendet ein Gerät, auf das nicht zugegriffen werden kann.
7 E2BIG
Argumentliste zu lang. Einem exec()-Aufruf wurde eine Argumentli-
ste übergeben, die länger als ARGMAX Bytes ist. Die Obergrenze
für die Länge einer Argumentliste ist die Summe aus der Größe der
Argumentliste und der Größe aller von der Umgebung exportierten
Shell-Variablen.
8 ENOEXEC
Ungültiges Format der Binärdatei. Es wurde versucht, eine Datei
auszuführen, für die zwar die entsprechenden Berechtigungen
gesetzt sind, die jedoch nicht mit einem gültigen Format beginnt
[siehe auch a.out(4)].
9 EBADF
Ungültige Dateinummer. Ein Dateideskriptor bezieht sich nicht auf
eine offene Datei.
10 ECHILD
Keine Sohnprozesse vorhanden. Ein Aufruf von wait() wurde von
einem Prozeß ausgeführt, der keine Sohnprozesse hat, oder keine,
auf die er noch warten könnte.
11 EAGAIN
Systemresourcen temporär erschöpft. Der fork()-Aufruf war erfol-
glos, weil die Prozeßtabelle des Systems voll ist oder der Benut-
zer keine weiteren Prozesse mehr starten darf. Es ist auch mög-
lich, daß ein Systemaufruf wegen unzureichendem Speicher- oder
Swap-Bereich gescheitert ist.
Seite 21 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
12 ENOMEM
Hauptspeicher erschöpft. Während der Ausführung einer exec()-,
brk()- oder sbrk()-Routine fordert ein Programm mehr Platz an,
als das System bereitstellen kann. Die maximal verwendbare Spei-
cherplatzgröße wird durch einen Systemparameter vergeben. Der
Fehler kann auch dann auftreten, wenn die Anordnung von Text,
Daten und Stacksegmenten zuviele Segmentregister erfordert, oder
wenn während der Ausführung einer fork-Routine kein ausreichender
Swap-Bereich zur Verfügung steht.
13 EACCES
Zugriff untersagt. Auf eine Datei wurde in einer Weise zugegrif-
fen, die durch die Dateizugriffsrechte untersagt ist.
14 EFAULT
Adresse oder Parameter ungültig. Das System hat beim Versuch, ein
Argument einer Routine zu benutzen, einen Hardwarefehler erzeugt.
errno kann diesen Wert beispielsweise dann erhalten, wenn bei
einer Routine, die ein Zeigerargument vorsieht, eine ungültige
Adresse übergeben wird, und zwar zu jedem beliebigen Zeitpunkt,
zu dem das System diese Bedingung erkennen kann. Da sich Systeme
in ihrer Fähigkeit, zuverlässig fehlerhafte Adressen zu erkennen,
unterscheiden, gehört das Übergeben von fehlerhaften Adressen an
eine Routine zu den Situationen mit einem undefinierten Verhal-
ten.
15 ENOTBLK
Nur bei blockorientierten Geräten möglich. Eine nicht blockorien-
tierte Datei wurde angegeben, während ein blockorientiertes Gerät
benötigt wird (z. B. bei einem Aufruf der mount()-Routine).
16 EBUSY
Resource nicht verfügbar. Es wurde versucht, ein Gerät einzuhän-
gen, das bereits eingehängt ist, oder es wurde versucht, ein
Gerät auszuhängen, auf dem sich eine aktive Datei (offene Datei,
aktuelle Datei, eingehängte Datei, aktives Textsegment) befindet.
Diese Fehlersituation tritt auch dann auf, wenn versucht wird,
die Prozesse zur Benutzerabrechnung zu aktivieren, obwohl diese
bereits aktiv sind.
17 EEXIST
Datei oder Dateiverzeichnis bereits vorhanden. Eine vorhandene
Datei wurde in einem falschen Zusammenhang angegeben (z. B. beim
Aufruf der link()-Routine).
18 EXDEV
Verweis über Gerätegrenzen hinaus. Es wurde versucht, einen Ver-
weis auf eine Datei auf einem anderen Gerät zu erzeugen.
Seite 22 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
19 ENODEV
Gerät existiert nicht. Es wurde versucht, eine falsche Operation
auf ein Gerät anzuwenden (z. B. Lesen von einem Gerät, auf das
nur geschrieben werden darf).
20 ENOTDIR
Ist kein Verzeichnis. Es wurde kein Dateiverzeichnis angegeben,
wo ein Dateiverzeichnis benötigt wird [z. B. in einem Pfad-Präfix
oder als Argument für chdir(2)].
21 EISDIR
Ist ein Verzeichnis. Es wurde versucht, direkt in ein Dateiver-
zeichnis zu schreiben.
22 EINVAL
Ungültiges Argument. Ein ungültiges Argument wurde verwendet; ein
undefiniertes Signal wurde in signal(2) oder kill(2) verwendet.
23 ENFILE
Tabelle der offenen Dateien voll. Die Systemtabelle für Dateien
ist voll, d. h. SYSOPEN Dateien sind geöffnet, und vorübergehend
können keine weiteren Dateien geöffnet werden.
24 EMFILE
Zuviele offene Dateien. Ein Prozeß darf höchstens OPENMAX Datei-
deskriptoren gleichzeitig verwenden.
25 ENOTTY
Kein Typewriter. Es wurde versucht, ein ioctl() auf eine Datei
anzuwenden, die keine zeichenorientierte Gerätedatei ist.
26 ETXTBSY
Programm aktiv. Es wurde versucht, ein direkt ablauffähiges Pro-
gramm auszuführen, das zu diesem Zeitpunkt zum Schreiben geöffnet
war. Dies gilt ebenfalls bei einem Versuch, ein ausführbares Pro-
gramm während seiner Ausführung zu löschen oder zu überschreiben.
27 EFBIG
Datei zu lang. Die Länge einer Datei hat die maximale Dateigröße
oder FCHRMAX überschritten [siehe auch getrlimit(2)].
28 ENOSPC
Plattenplatz erschöpft. Während des Schreibens ist kein freier
Platz mehr auf dem Datenträger übrig. Bei fcntl() ist das Setzen
oder Aufheben von Datensatzsperren in einer Datei nicht möglich,
weil das System keine weiteren Datensatz-Einträge übrig hat.
29 ESPIPE
Ungültige Positionieranweisung. Ein lseek() wurde in einer Pipe-
line verwendet.
Seite 23 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
30 EROFS
Dateisystem nur zum Lesen. Es wurde versucht, eine Datei oder ein
Dateiverzeichnis in einem Dateisystem mit Schreibschutz zu
ändern.
31 EMLINK
Zu viele Verweise. Es wurde versucht, mehr als die maximal zuläs-
sige Anzahl von Verweisen (LINKMAX) auf eine Datei zu legen.
32 EPIPE
Pipeline unterbrochen. Es wurde versucht, in eine Pipeline zu
schreiben, für die es keinen Prozeß zum Lesen der Daten gibt.
Diese Bedingung erzeugt normalerweise ein Signal; der Fehler wird
zurückgegeben, wenn dieses Signal ignoriert wird.
33 EDOM
Mathematisches Argument außerhalb des Definitionsbereichs. Das
Argument einer mathematischen Funktion (3M) liegt außerhalb des
Definitionsbereichs.
34 ERANGE
Resultat nicht darstellbar. Der Wert einer mathematischen Funk-
tion (3M) kann innerhalb der Gerätegenauigkeit nicht dargestellt
werden.
35 ENOMSG
Keine Nachricht des gewünschten Typs. Es wurde versucht, eine
Nachricht eines Typs zu empfangen, der in der angegebenen
Nachrichten-Warteschlange nicht vorhanden ist [siehe auch
msgop(2)].
36 EIDRM
Bezeichner gelöscht. Dieser Fehler wird an Prozesse zurückgege-
ben, die die Ausführung aufgrund der Entfernung eines Bezeichners
aus dem Wertebereich der Namen des Interprozeß-Kommunikations-
system wiederaufnehmen [siehe msgctl(2), semctl(2) und
shmctl(2)].
37 ECHRNG
Kanalnummer nicht im zulässigen Bereich.
38 EL2NSYNC
Ebene 2 nicht synchronisiert.
39 EL3HLT
Ebene 3 beendet.
40 EL3RST
Reset auf Ebene 3.
41 ELNRNG
Verweisnummer nicht im zulässigen Bereich.
Seite 24 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
42 EUNATCH
Protokolltreiber nicht eingerichtet.
43 ENOCSI
Keine CSI-Struktur verfügbar.
44 EL2HLT
Ebene 2 beendet.
45 EDEADLK
Gefahr eines Deadlocks. Ein Deadlock wurde festgestellt und ver-
mieden. Dieser Fehler bezieht sich auf Datei- und Datensatzsper-
ren.
46 ENOLCK
Keine Datensatzsperren verfügbar. Es sind keine weiteren Sperren
verfügbar. Die Systemtabelle für Sperren ist voll [siehe
fcntl(2)].
47-49
Reserviert.
50 EBADE
Fehlerhafter Austausch-Deskriptor.
51 EBADR
Fehlerhafter Anforderungs-Deskriptor.
52 EXFULL
Meldungstabellen voll.
53 ENOANO
Überlauf in Anode-Tabelle.
54 EBADRQC
Fehlerhafter Anforderungscode.
55 EBADSLT
Ungültiger Slot.
56 EDEADLOCK
Dateisperren-Deadlock.
57 EBFONT
Fehlerhaftes Font-Dateiformat.
58-59
Reserviert.
60 ENOSTR
Kein Stream. Es wurde versucht, die Systemaufrufe putmsg() oder
getmsg() auf eine Datei anzuwenden, die keine STREAM-Datei ist.
Seite 25 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
61 ENODATA
Keine Daten verfügbar.
62 ETIME
Zeituhr abgelaufen. Die für einen STREAMS-Systemaufruf ioctl()
gesetzte Zeituhr ist abgelaufen. Die Ursache für diesen Fehler
ist gerätespezifisch und kann entweder einen Hardware- oder einen
Software-Fehler anzeigen oder möglicherweise auch einen Zeitwert,
der für die bestimmte Funktion zu klein ist. Der Status der
ioctl()-Funktion ist unbestimmt.
63 ENOSTR
Keine weiteren Betriebsmittel für STREAMS verfügbar. Während
eines STREAMS-open standen entweder keine STREAMS-Warteschlangen
oder keine STREAMS-Kopfdatenstrukturen zur Verfügung. Dies ist
eine vorübergehende Fehlersituation; sobald andere Prozesse Res-
sourcen freigeben, ist der Fehler behoben.
64 ENONET
Rechner nicht an das Netzwerk angeschlossen.
65 ENOPKG
Paket nicht installiert. Dieser Fehler tritt auf, wenn der Benut-
zer die Verwendung eines Systemaufrufs versucht, der Teil eines
nicht installierten Pakets ist.
66 EREMOTE
Objekt ist remote (fernes Objekt).
67 ENOLINK
Verweis wurde abgeschnitten.
68 EADV
Anmeldefehler.
69 ESRMNT
Srmount-Fehler.
70 ECOMM
Kommunikationsfehler beim Senden.
71 EPROTO
Protokollfehler. Dieser Fehler ist gerätespezifisch, steht im
allgemeinen jedoch nicht in Zusammenhang mit einem Hardware-
Ausfall.
72-73
Reserviert.
74 EMULTIHOP
Kein Überspringen möglich.
Seite 26 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
75-76
Reserviert.
77 EBADMSG
Keine zulässige Daten-Nachricht. Bei einem Systemaufruf read(),
getmsg() oder ioctl() auf einem STREAMS-Gerät ist etwas an den
Kopf der Warteschlange gelangt, das nicht verarbeitet werden
kann. Was dies ist, hängt jeweils vom verwendeten Systemaufruf
ab:
read() Steuerinformationen oder ein weitergereichter Dateide-
skriptor
getmsg() ein weitergereichter Dateideskriptor
ioctl() Steuer- oder Dateninformationen
78 ENAMETOOLONG
Dateiname zu lang. Die Länge eines Pfadnamen-Arguments über-
schreitet PATHMAX Zeichen, oder die Länge überschreitet NAMEMAX
[siehe limits(4)].
79 EOVERFLOW
Wert ist für den definierten Datentyp zu groß.
80 ENOTUNIQ
Name im Netzwerk nicht eindeutig.
81 EBADFD
Dateideskriptor in falschem Zustand. Entweder verweist ein Datei-
deskriptor nicht auf eine geöffnete Datei, oder ein Lesezugriff
wurde auf eine Datei versucht, die nur zum Schreiben geöffnet
wurde.
82 EREMCHG
Adresse für fernen Zugriff geändert.
83 ELIBACC
Kein Zugriff auf benötigte, gemeinsam benutzte Bibliothek mög-
lich. Es wurde versucht, mit exec() ein a.out zu starten, das
eine gemeinsam benutzte Bibliothek benötigt, und die gemeinsam
benutzte Bibliothek ist nicht vorhanden, bzw. der Benutzer hat
keine Erlaubnis für ihre Benutzung.
84 ELIBBAD
Zugriff auf beschädigte, gemeinsam benutzte Bibliothek. Es wurde
versucht, mit exec() ein a.out zu starten, das eine gemeinsam
benutzte Bibliothek benötigt (um dazugebunden zu werden), und
exec() konnte die gemeinsam benutzte Bibliothek nicht laden. Die
gemeinsam benutzte Bibliothek ist wahrscheinlich beschädigt.
Seite 27 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
85 ELIBSCN
.lib-Abschnitt in a.out beschädigt. Es wurde versucht, mit exec()
ein a.out auszuführen, das eine gemeinsam benutzte Bibliothek
(zum Einbinden) benötigt, und in dem .lib-Abschnitt von a.out
waren fehlerhafte Daten vorhanden. Dem .lib-Abschnitt entnimmt
exec() die Information, welche gemeinsam benutzten Bibliotheken
benötigt werden.
86 ELIBMAX
Versuch, mehr gemeinsam benutzte Bibliotheken als zulässig einzu-
binden. Es wurde versucht, mit exec() ein a.out auszuführen, das
mehr gemeinsam benutzte Bibliotheken benötigt als auf Grundlage
der aktuellen Konfiguration des Systems zulässig sind.
87 ELIBEXEC
Kein direktes Ausführen einer gemeinsam benutzten Bibliothek mög-
lich. Es wurde versucht, eine gemeinsam benutzte Bibliothek
direkt mit exec() auszuführen.
88 EILSEQ
Unzulässige Bytesequenz. Behandlung mehrerer Zeichen als einzel-
nes Zeichen.
89 ENOSYS
Operation nicht anwendbar.
90 ELOOP
Anzahl der symbolischen Verweise während der Traversierung eines
Pfades überschreitet MAXSYMLINKS.
91 ERESTART
Unterbrochener Systemaufruf sollte erneut gestartet werden.
92 ESTRPIPE
Wenn Pipe/FIFO, dann kein sleep in Stream-Head.
93 ENOTEMPTY
Verzeichnis nicht leer.
94 EUSERS
Zu viele Benutzer (für UFS).
95 ENOTSOCK
Socket-Operation an Nicht-Socket.
96 EDESTADDRREQ
Zieladresse benötigt. Eine benötigte Adresse für eine Operation
auf einem Endpunkt einer Transportverbindung war nicht angegeben.
Eine Zieladresse wird benötigt.
Seite 28 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
97 EMSGSIZE
Nachricht zu lang. Eine Nachricht, die an den Diensterbringer der
Transportverbindung gesendet wurde, war größer als der interne
Nachrichtenpuffer oder irgend eine andere Begrenzung im Netzwerk.
98 EPROTOTYPE
Falscher Protokolltyp für Socket. Es wurde ein Protokoll angege-
ben, das die Semantik des geforderten Socket-Typs nicht unter-
stützt.
99 ENOPROTOOPT
Protokoll nicht verfügbar. Eine falsche Version oder eine falsche
Ebene wurde beim Abfragen oder beim Setzen von Protokolloptionen
verwendet.
100-109
Reserviert.
110 ENOLIMFILE
Lnode-Datenbasis nicht geöffnet. Wenn ShareII läuft, werden alle
Prozesse dem Wurzel-Lnode zugeordnet. Informationen liefert die
Referenzseite zu dem ShareII-Kommando charge, mit dem die Daten-
basis geöffnet und geschlossen wird. ShareII schließt die Daten-
basis automatisch, wenn die aktuelle Lizenz ausläuft.
111 EPROCLIM
Prozeß-Limit erreicht. Ein fork()-Aufruf kann fehlschlagen, wenn
das Prozeß-Limit von ShareII für den Lnode erreicht ist, dem der
fork-Prozeß zugeordnet ist. Beachten Sie, daß Prozeß-Limits für
die gesamte Lnode-Hierarchie gelten.
112 EDISJOINT
Lnode-Hierarchie ist auseinandergerissen. Entweder durch Datenbe-
schädigung oder durch die Zwangsentfernung eines Lnode mit
Abkömmlingen (Unterstrukturen) enthält die Lnode-Datenbasis von
ShareII einen verwaisten Lnode. Prozesse können einem verwaisten
Lnode nicht zugeordnet werden.
113 ENOLOGIN
Kein Login erlaubt. Der Benutzer hat ein ShareII-Flag
flag.nologin gesetzt. Die Rückmeldung ist abhängig von diesem
Flag.
114 ELOGINLIM
Login-Limit erreicht. Der Benutzer hat ein ShareII-Flag
flag.onelogin gesetzt. Die Rückmeldung ist abhängig von diesem
Flag und das Login-Zählerattribut von ShareII ist für diesen
Benutzer bereits 1.
Seite 29 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
115 EGROUPLOOP
Schleife in Lnode-Hierarchie. Beim Aktivieren eines Lnode wurde
festgestellt, daß der Lnode-Baum tiefer reicht als das konfigu-
rierte Maximum. Beim Auswechseln eines Vater-Lnode würde die
Tiefe des verschobenen Lnode das konfigurierte Maximum über-
schreiten.
116 ENOATTACH
Zuordnung zu einem Lnode nicht erlaubt. Der Lnode hat ein
ShareII-Flag flag.noattach gesetzt. Die Rückmeldung ist abhängig
von diesem Flag.
117-119
Reserviert.
120 EPROTONOSUPPORT
Protokoll nicht unterstützt. Das Protokoll ist im aktuellen
System nicht konfiguriert, oder es existiert dafür keine Unter-
stützung.
121 ESOCKTNOSUPPORT
Socket-Typ nicht unterstützt. Für den angegebenen Socket-Typ ist
das aktuelle System nicht konfiguriert, oder es existiert dafür
keine Unterstützung.
122 EOPNOTSUPP
Operation am Endpunkt der Transportverbindung nicht unterstützt.
Beispielsweise der Versuch, eine Verbindung auf einem Endpunkt
einer Datagram-Transportverbindung zu akzeptieren.
123 EPFNOSUPPORT
Protokollfamilie nicht unterstützt. Die Protokollfamilie ist im
aktuellen System nicht konfiguriert, oder es existiert dafür
keine Implementierung. Der Fehler tritt bei Internet-Protokollen
auf.
124 EAFNOSUPPORT
Adreßfamile durch Protokollfamilie nicht unterstützt. Eine mit
dem angeforderten Protokoll nicht kompatible Adresse wurde ver-
wendet.
125 EADDRINUSE
Adresse bereits verwendet. Der Benutzer versuchte, eine Adresse
zu verwenden, die bereits verwendet wurde, obwohl das Protokoll
dies nicht zuläßt.
126 EADDRNOTAVAIL
Angegebene Adresse kann nicht verwendet werden. Es wurde ver-
sucht, einen Endpunkt für eine Transportverbindung mit einer
Adresse einzurichten, die nicht auf dem aktuellen Rechner liegt.
Seite 30 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
127 ENETDOWN
Netzwerk ist nicht aktiv. Eine Operation fand ein inaktives Netz-
werk vor.
128 ENETUNREACH
Netzwerk nicht erreichbar. Eine Operation wurde an ein nicht
erreichbares Netzwerk gerichtet.
129 ENETRESET
Netzwerk hat Verbindung wegen Reset abgebaut. Der Host, mit dem
Sie verbunden sind, ist abgestürzt und wurde neu geladen.
130 ECONNABORTED
Abbruch der Verbindung durch Software. Aus internen Gründen Ihres
Hosts bricht die Verbindung ab.
131 ECONNRESET
Verbindung durch Kommunikationspartner rückgesetzt. Der Kommuni-
kationspartner hat die Verbindung abgebrochen. Normalerweise wird
dies aufgrund einer Zeitüberschreitung oder aufgrund eines Neu-
starts des Rechners ausgelöst.
132 ENOBUFS
Kein Speicherplatz für Datenpuffer verfügbar. Eine Operation auf
einem Endpunkt einer Transportverbindung konnte aufgrund mangeln-
den Speicherplatzes für Datenpuffer oder aufgrund einer vollen
Warteschlange nicht ausgeführt werden.
133 EISCONN
Endpunkt einer Transportverbindung ist bereits verbunden. Es
wurde eine Verbindung angefordert oder mit sendto oder sendmsg
eine Zieladresse angegeben, obwohl der Endpunkt bereits verbunden
war.
135 EUCLEAN
Struktur muß bereinigt werden.
136 Reserviert.
137 ENOTNAM
Keine XENIX-Namendatei.
138 ENAVAIL
Nicht verfügbar.
139 EISNAM
Ist eine XENIX-Namendatei.
140 EREMOTEIO
Remote-E/A-Fehler.
Seite 31 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
141 EINIT
Reserviert.
142 EREMDEV
Reserviert.
134 ENOTCONN
Endpunkt einer Transportverbindung nicht verbunden. Die Anforde-
rung nach Senden oder Empfangen von Daten konnte nicht erfüllt
werden, da der Kommunikationsendpunkt nicht verbunden war und
(beim Senden von Datagrammen) keine Adresse angegeben wurde.
143 ESHUTDOWN
Kein Senden nach Schließen des Endpunkts einer Transportverbin-
dung. Das geforderte Senden von Daten war nicht möglich, da der
Kommunikationsendpunkt bereits geschlossen wurde.
144 ETOOMANYREFS
Zu viele Referenzen: Verbindung nicht möglich.
145 ETIMEDOUT
Zeitüberschreitung für Verbindung. Ein Verbindungsaufbau oder
eine Sendeanforderung scheiterte, weil der Kommunikationspartner
nicht ordnungsgemäß innerhalb der vorgegebenen Zeit antwortete.
Das Zeitintervall ist abhängig vom Kommunikationsprotokoll.
146 ECONNREFUSED
Verbindung verweigert. Der Verbindungsaufbau war nicht möglich,
weil der Zielrechner diese verweigert. Dieser Fehler entsteht
üblicherweise beim Versuch, eine Verbindung zu einem Dienst her-
zustellen, der auf dem fernen Rechner nicht aktiv ist.
147 EHOSTDOWN
Host ist nicht aktiv. Eine Operation des Transportdienstgebers
ist gescheitert, weil der Zielrechner nicht aktiv ist.
148 EHOSTUNREACH
Keine Verbindung zu Host bekannt. Eine Operation des Transport-
dienstgebers versuchte, einen nicht erreichbaren Host zu verwen-
den.
149 EALREADY
Operation bereits aktiv. Es wurde versucht, eine weitere Opera-
tion auf einem nichtblockierenden Objekt zu starten, das bereits
eine Operation bearbeitet.
150 EINPROGRESS
Operation jetzt aktiv. Es wurde versucht, eine Operation, die
eine lange Zeit benötigt (wie zum Beispiel connect), auf einem
nichtblockierenden Objekt auszuführen.
Seite 32 Reliant UNIX 5.44 Gedruckt 11/98
intro_prm2(2) intro_prm2(2)
151 ESTALE
Unwirksamer NFS-Dateibezeichner.
152-157
Reserviert.
158 ECANCELED
Operation beendet.
159 EHANDLER
Signal-Behandler existiert.
160-199
Reserviert.
500 EIORESID
Block nicht vollständig übertragen.
VERZEICHNISSE
INCDIR Standardverzeichnis für #include-Dateien (gewöhnlich
/usr/include bzw. /usr/include/sys)
SIEHE AUCH
introprm1(1), introprm5(5).
Kapitel "Objektdateien" in "Leitfaden und Werkzeuge für die Program-
mierung mit C".
Seite 33 Reliant UNIX 5.44 Gedruckt 11/98