Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ exec(2) — Reliant UNIX 5.44c4

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

ps(1)

sh(1)

alarm(2)

exit(2)

fcntl(2)

fork(2)

getrlimit(2)

nice(2)

priocntl(2)

ptrace(2)

semop(2)

signal(2)

sigpending(2)

sigprocmask(2)

times(2)

umask(2)

atexit(3C)

lockf(3C)

system(3S)

a.out(4)

unistd(4)

environ(5)

lfs(5)

exec(2)                                                             exec(2)

NAME
     exec: execl, execv, execle, execve, execlp, execvp - Datei ausführen

SYNTAX
     #include <unistd.h>

     int execl(const char *path, const char *arg0, ...,
                const char *argn, (char *)0);

     int execv(const char *path, char *const *argv);

     int execle(const char *path, const char *arg0, ...,
                 const char *argn, (char *0), const char *envp[]);

     int execve(const char *path, char *const *argv,
                 char *const envp[]);

     int execlp(const char *file, const char *arg0, ...,
                 const char *argn, (char *)0);

     int execvp(const char *file, char *const *argv);

BESCHREIBUNG
     exec überlagert in allen seinen Formen einen alten Prozeß mit einem
     neuen Prozeß. Der neue Prozeß wird von einer regulären ausführbaren
     Datei erzeugt. Diese Datei ist entweder eine ausführbare Objektdatei
     oder eine Datendatei für einen Interpreter. Von einem erfolgreichen
     exec-Aufruf kann nicht zurückgekehrt werden, da das Abbild des aufru-
     fenden Prozesses von dem neuen Prozeß überlagert wird.

     Eine Interpreter-Datei beginnt mit einer Zeile der Form

          #! pathname [arg]

     wobei der pathname der Pfad des Interpreters und arg ein optionales
     Argument ist. Wenn eine Interpreter-Datei ausgeführt wird, führt das
     System den angegebenen Interpreter aus. Der angegebene Pfadname wird
     als arg0 an den Interpreter übergeben. Wenn arg in der Interpreter-
     Datei angegeben wurde, wird es als arg1 an den Interpreter übergeben.
     Die verbleibenden Argumente für den Interpreter sind arg0 bis argn der
     ursprünglich ausgeführten Datei.

     Wird ein C-Programm ausgeführt, wird es wie folgt aufgerufen:

          int main(int argc, char *argv[], char *envp[]);

     Hierbei ist argc der Argumentzähler, argv ein Feld von Zeigern auf die
     Argumente selbst und envp ein Feld von Zeigern auf die Umgebungsvaria-
     blen. argc ist mindestens 1, und das erste Element des Feldes weist
     auf eine Zeichenkette, die den Namen der Programmdatei enthält.





Seite 1                      Reliant UNIX 5.44               Gedruckt 11/98

exec(2)                                                             exec(2)

     path weist auf einen Pfadnamen, der die neue Programmdatei des Prozes-
     ses bezeichnet.

     file weist auf die neue Programmdatei des Prozesses. Wenn file einen
     Schrägstrich enthält, wird dieses Argument als Pfadname der Datei
     angesehen. Wenn file keinen Schrägstrich enthält, wird der Pfad für
     diese Datei durch Durchsuchen der Verzeichnisse gefunden, die in der
     Umgebungsvariablen PATH definiert werden [siehe environ(5)]. Die Umge-
     bung wird typischerweise von der Shell bereitgestellt [siehe sh(1)].

     Wenn die neue Prozeßdatei keine ausführbare Objektdatei ist, verwenden
     execlp() und execvp() den Inhalt dieser Datei als Standardeingabe für
     sh(1).

     Die Argumente arg0, ..., argn zeigen auf Zeichenketten, die mit dem
     Null-Byte abgeschlossen sind. Diese Zeichenketten stellen die Argu-
     mentliste dar, die für das neue Prozeßabbild zur Verfügung steht.
     Wenigstens arg0 muß vorhanden sein. Es wird der Name des Prozesses,
     wie er vom Kommando ps angezeigt wird. arg0 zeigt auf eine Zeichen-
     kette, die dieselbe wie path (oder die letzte Komponente von path)
     ist. Die Liste der Argumentzeichenketten wird durch ein Argument
     (char *)0 beendet.

     argv ist ein Feld von Zeigern auf Zeichenketten, die mit dem Null-Byte
     abgeschlossen sind. Diese Zeichenketten stellen die Argumentliste dar,
     die dem neuen Prozeßabbild zur Verfügung steht. argv hat wenigstens
     ein Element, das auf eine Zeichenkette weist, die dieselbe wie path
     (oder ihre letzte Komponente) ist. argv wird mit einem Nullzeiger
     abgeschlossen.

     envp ist ein Feld von Zeigern auf Zeichenketten, die mit dem Null-Byte
     abgeschlossen sind. Diese Zeichenketten stellen die Umgebung für das
     neue Prozeßabbild dar. envp wird mit einem Nullzeiger abgeschlossen.
     Bei execl(), execv(), execvp() und execlp() setzt die C-Laufzeit-
     Startroutine einen Zeiger auf die Umgebung des aufrufenden Prozesses
     in dem globalen Objekt extern char **environ, und diese wird zum Wei-
     terreichen der Umgebung des aufrufenden Prozesses an den neuen Prozeß
     verwendet.

     Die Dateien, die im aufrufenden Prozeß offen sind, bleiben auch im
     neuen Prozeß offen. Eine Ausnahme bilden dabei jene Dateien, deren
     Status-Bit für "Schließen-bei-exec" gesetzt ist [siehe fcntl(2)]. Bei
     Dateideskriptoren, die offen bleiben, wird der Schreib-/Lesezeiger
     nicht verändert.

     Für jene Signale, die im aufrufenden Prozeß abgefangen werden, wird im
     neuen Prozeßabbild die Standardeinstellung eingestellt [siehe
     signal(2)]. In den anderen Fällen erbt das neue Prozeßabbild die Ein-
     stellungen bezüglich der Signale vom aufrufenden Prozeß.





Seite 2                      Reliant UNIX 5.44               Gedruckt 11/98

exec(2)                                                             exec(2)

     Nach dem erfolgreichen Aufruf einer der exec-Funktionen sind alle vor-
     her von atexit() registrierten Funktionen nicht mehr registriert.

     Wenn das Bit zum Setzen der Benutzernummer bei Ausführung in der neuen
     Programmdatei des Prozesses gesetzt ist [siehe chmod(2)], setzt exec
     die effektive Benutzernummer des neuen Prozesses auf die Benutzernum-
     mer der neuen Prozeßdatei. Entsprechend wird bei gesetztem Bit zum
     Setzen der Gruppennummer bei Ausführung die effektive Gruppennummer
     des neuen Prozesses auf die Gruppennummer der Prozeßdatei gesetzt. Die
     reale Benutzernummer und die reale Gruppennummer des neuen Prozesses
     bleiben dieselben wie beim aufrufenden Prozeß. Darüber hinaus wird bei
     gesetztem Bit zum Setzen der Benutzernummer der neuen Prozeßdatei und
     bei Nichtidentität von realer und effektiver Benutzernummer der Grenz-
     wert der Datei auf den Standardwert des Systems gesetzt.

     Ist die effektive Benutzerkennung gleich root oder gleich Systemver-
     walter, so werden die "set-user-ID"- und "set-group-ID"-Bits berück-
     sichtigt, vorausgesetzt, der Prozeß wird durch ptrace() überwacht.

     Die gemeinsam benutzten Speichersegmente (Shared Memory Segments), die
     dem aufrufenden Prozeß zugeordnet waren, werden dem neuen Prozeß nicht
     zugeordnet [siehe shmop(2)]. Für den neuen Prozeß wird das Profilieren
     abgeschaltet [siehe profil(2)]. Außerdem übernimmt der neue Prozeß
     noch folgende Attribute vom aufrufenden Prozeß:

     -  nice-Wert [siehe nice(2)]

     -  Prozeßklasse und Priorität [siehe priocntl(2)]

     -  Prozeßnummer

     -  Prozeßnummer des Vaters

     -  Prozeßnummer der Gruppe

     -  reale Benutzernummer

     -  reale Gruppennummer

     -  zusätzliche Gruppennummern

     -  semadj-Werte [siehe semop(2)]

     -  Sitzungsnummer [siehe exit(2) und signal(2)]

     -  Ablaufverfolgungsanzeiger [siehe ptrace(2), request 0)

     -  Restzeit, bis zu einem Alarmuhr-Signal [siehe alarm(2)]

     -  aktuelles Verzeichnis

     -  "root"-Verzeichnis


Seite 3                      Reliant UNIX 5.44               Gedruckt 11/98

exec(2)                                                             exec(2)

     -  Schutzbitmaske des Prozesses [siehe umask(2)]

     -  Grenzwerte für Dateien [siehe ulimit(2) und getrlimit(2)]

     -  Betriebsmittel-Grenzwerte [siehe getrlimit(2)]

     -  tmsutime(), tmsstime(), tmscutime() und tmscstime [siehe
        times(2)]

     -  Dateisperren [siehe fcntl(2) und lockf(3C)]

     -  steuerndes Terminal

     -  Prozeß-Signalmaske [siehe sigprocmask(2)]

     -  unbearbeitete Signale [siehe sigpending(2)]

     Bei erfolgreicher Ausführung sieht exec die Veränderung des statime-
     Feldes der Datei vor. Sollte exec erfolgreich ausgeführt worden sein,
     so wird die Datei des Prozeßabbilds als mit open() geöffnet betrach-
     tet. Das zugehörige close() erfolgt konzeptionell nach dem Öffnen,
     aber vor dem Prozeßende oder einer erfolgreichen Bearbeitung eines
     weiteren Aufrufs von exec.

FEHLER
     Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
     Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
     errno(5).

     exec ist erfolglos und kehrt zum aufrufenden Prozeß zurück, wenn einer
     oder mehrere der nachstehenden Punkte zutreffen:

     EACCES        In einem der Verzeichnisse, die im Pfad der Datei des
                   neuen Prozesses aufgelistet sind, ist keine Erlaubnis
                   zum Durchsuchen gegeben.

     E2BIG         Die Anzahl der Bytes in der Argumentliste des neuen Pro-
                   zesses ist größer als die systembedingte Obergrenze von
                   20480 Bytes. Die Obergrenze der Argumentliste ist die
                   Summe der Größe der Argumentliste plus die Größe der von
                   der Umgebung exportierten Shell-Variablen.

     EACCES        Die neue Prozeßdatei ist keine reguläre Datei.

     EACCES        Der Modus der neuen Prozeßdatei erlaubt keine Ausfüh-
                   rung.

     EAGAIN        Die Gesamtmenge des Systemspeichers, die während des
                   Lesens über zeichenorientierte E/A verfügbar ist, reicht
                   zeitweise nicht aus.

     EFAULT        Angeforderte Hardware ist nicht vorhanden.


Seite 4                      Reliant UNIX 5.44               Gedruckt 11/98

exec(2)                                                             exec(2)

     EFAULT        Ein a.out, das mit MAU oder dem 32B-Schalter übersetzt
                   wurde, läuft auf einem Rechner ohne ein MAU oder 32B.

     EFAULT        Ein Argument zeigt auf eine ungültige Adresse.

     EINTR         Ein Signal wurde während des Systemaufrufs exec abgefan-
                   gen.

     ELIBACC       Angeforderte, gemeinsam benutzte Bibliothek hat keine
                   Ausführerlaubnis.

     ELIBEXEC      Es wird versucht, eine gemeinsam benutzte Bibliothek
                   direkt mit exec auszuführen.

     ELOOP         Beim Übersetzen von path oder file wurden zuviele symbo-
                   lische Verweise angetroffen.

     EMULTIHOP     Die Komponenten von path erfordern den Sprung auf meh-
                   rere ferne Rechner, und der Dateisystemtyp erlaubt das
                   nicht.

     ENAMETOOLONG  Die Länge des file- oder path-Arguments oder ein Element
                   der Umgebungsvariable PATH als Dateipräfix übertrifft
                   PATHMAX, oder die Länge einer file- oder path-Kompo-
                   nente übertrifft NAMEMAX.

     ENOENT        Eine oder mehrere Komponenten des Pfadnamens des neuen
                   Prozesses der Datei existieren nicht, oder er ist gleich
                   Null.

     ENOTDIR       Eine Komponente des neuen Prozeßpfades ist kein Ver-
                   zeichnis.

     ENOEXEC       Der exec-Aufruf ist kein execlp() oder execvp(), und die
                   neue Prozeßdatei hat die entsprechende Zugriffserlaub-
                   nis, jedoch kein gültiges Format.

     ETXTBSY       Die Datei ist eine reine Programmdatei (gemeinsam
                   benutzter Text), die gerade von einem anderen Prozeß
                   beschrieben wird.

     ENOMEM        Der neue Prozeß erfordert mehr Speicherplatz als vom
                   systembedingten Maximum MAXMEM zugelassen wird.

     ENOLINK       path weist auf einen fernen Rechner, und die Verbindung
                   zu diesem Rechner ist nicht mehr aktiv.

ERGEBNIS
     Wenn exec zu dem aufrufenden Prozeß zurückkehrt, ist ein Fehler aufge-
     treten; der Rückgabewert ist dann -1, und errno wird zur Anzeige des
     Fehlers gesetzt.



Seite 5                      Reliant UNIX 5.44               Gedruckt 11/98

exec(2)                                                             exec(2)

HINWEISE
     Wenn Sie in Ihrer Anwendung nicht die voreingestellten C-Locale ver-
     wenden, müssen Sie setlocale(3C) mit den entsprechenden Argumenten
     aufrufen, um die Umgebung für den neuen Prozeß einzustellen.

SIEHE AUCH
     ps(1), sh(1), alarm(2), exit(2), fcntl(2), fork(2), getrlimit(2),
     nice(2), priocntl(2), ptrace(2), semop(2), signal(2), sigpending(2),
     sigprocmask(2), times(2), umask(2), atexit(3C), lockf(3C), system(3S),
     a.out(4), unistd(4), environ(5), lfs(5).












































Seite 6                      Reliant UNIX 5.44               Gedruckt 11/98

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026