BEZEICHNUNG¶
dup, dup2 - dupliziert einen Datei-Deskriptor
ÜBERSICHT¶
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
#define _GNU_SOURCE           /* Siehe feature_test_macros(7) */
#include <fcntl.h>    /* Definitionen der O_*-Konstanten abrufen */
#include <unistd.h>
int dup3(int oldfd, int newfd, int schalter);
BESCHREIBUNG¶
Der Systemaufruf 
dup() erzeugt eine Kopie des Dateideskriptors
  
oldfd mit der niedrigsten unbenutzten Nummer für den neuen
  Deskriptor.
Nach der erfolgreichen Rückkehr können die alten und neuen
  Datei-Deskriptoren synonym benutzt werden. Sie beziehen sich auf die gleichen
  offenen Datei-Deskriptoren (siehe 
open(2)) und teilen sich dadurch
  Dateiversatz (file offset) und Dateistatusschalter. Falls der Dateiversatz zum
  Beispiel durch 
lseek(2) auf einem der Deskriptoren geändert
  wurde, wird der Versatz auch für den anderen verändert.
Die beiden Deskriptoren teilen sich keine Datei-Deskriptor-Schalter (den
  Schalter »close-on-exec«). Der Schalter
  »close-on-exec« ( 
FD_CLOEXEC; siehe 
fcntl(2))
  für das Duplikat ist aus.
dup2()¶
Der Systemaufruf 
dup2() führt dieselben Aufgaben wie 
dup()
  durch, verwendet jedoch statt des kleinsten nicht benutzten Dateideskriptors
  die in 
newfd angegebene Zahl. Falls der Deskriptor 
newfd vorher
  bereits geöffnet wurde, wird er stillschweigend geschlossen, bevor er
  erneut benutzt wird.
Die Schritte zum Schließen und erneuten Verwenden des Dateideskriptors
  
newfd werden 
atomar (als logische Einheit) durchgeführt.
  Dies ist wichtig, da der Versuch gleichwertige Funktionalität mittels
  
close(2) und 
dup()zu implementieren, Gegenstand von Race
  Conditions sein könnte, bei denen 
newfd zwischen zwei Schritten
  erneut benutzt wird. Ein derartiges erneutes Verwenden kann vorkommen, da das
  Hauptprogramm durch ein Signalverarbeitungsprogramm unterbrochen wird, der
  einen Dateideskriptor reserviert oder weil ein paralleler Thread einen
  Dateideskriptor reserviert.
Beachten Sie die folgenden Punkte:
  - *
 
  - Falls oldfd kein gültiger Datei-Deskriptor ist,
      schlägt der Aufruf fehl und newfd wird nicht
    geschlossen.
 
  - *
 
  - Falls oldfd ein gültiger Datei-Deskriptor ist und
      newfd den gleichen Wert wie oldfd hat, dann tut
      dup2() nichts und gibt newfd zurück.
 
dup3()¶
dup3() entspricht 
dup2(), außer dass:
  - *
 
  - Der Aufrufende kann erzwingen, dass der Schalter
      »close-on-exec« für den neuen Datei-Deskriptor durch
      Angabe von O_CLOEXEC in schalter gesetzt wird. Lesen Sie die
      Beschreibung des gleichnamigen Schalters in open(2), um zu
      erfahren, warum dies nützlich sein könnte.
 
  - *
 
  - Falls oldfd newfd entspricht, schlägt dup3()
      mit dem Fehler EINVAL fehl.
 
RÜCKGABEWERT¶
Bei Erfolg geben diese Systemaufrufe den neuen Deskriptor zurück. Im
  Fehlerfall wird -1 zurückgegeben und 
errno entsprechend gesetzt.
FEHLER¶
  - EBADF
 
  - oldfd ist kein offener Datei-Deskriptor oder newfd ist
      außerhalb des für Datei-Deskriptoren erlaubten
    Bereiches.
 
  - EBUSY
 
  - (nur Linux) Dies könnte von dup2() oder dup3()
      während einer Gleichzeitigkeitsbedingung mit open(2) und
      dup() zurückgegeben werden.
 
  - EINTR
 
  - Der Aufruf von dup2() oder dup3() wurde von einem Signal
      unterbrochen; lesen Sie signal(7).
 
  - EINVAL
 
  - (dup3()) schalter enthält einen ungültigen
      Wert oder oldfd entsprach newfd.
 
  - EMFILE
 
  - Der Prozess hat bereits die maximale Anzahl an offenen Datei-Deskriptoren
      und versucht einen neuen zu öffnen.
 
VERSIONEN¶
dup3() wurde in Version 2.6.27 zu Linux hinzugefügt;
  Glibc-Unterstützung ist seit Version 2.9 verfügbar.
dup(), 
dup2(): SVr4, 4.3BSD, POSIX.1-2001.
dup3() ist Linux-spezifisch.
ANMERKUNGEN¶
Der von 
dup2 zurückgegebene Fehler unterscheidet sich von dem, der
  von 
fcntl(...,
F_DUPFD,...
) zurückgegeben wird,
  wenn 
newfd außerhalb des Bereiches ist. Weiterhin gibt
  
dup2 auf einigen Systemen 
EINVAL wie 
F_DUPFD
  zurück.
Falls 
newfd geöffnet war, sind alle Fehler verlorengegangen, die
  in dieser Zeit an 
close(2) gemeldet worden wären. Falls dies von
  Bedeutung ist, ist die korrekte Herangehensweise, —sofern das Programm
  nicht in einem einzigen Thread läuft und keine Dateideskriptoren in
  Signalverarbeitungsprogrammen reserviert—, 
newfd vor dem Aufruf
  von 
dup2() wegen der oben beschriebenen Race Conditions 
nicht zu
  schließen. Stattdessen kann Code wie der folgende verwendet werden:
    /* Erhält ein Duplikat von »newfd«, das nachfolgend benutzt
       werden kann, um auf Fehler von close() zu prüfen. Ein
       EBADF-Fehler bedeutet, dass »newfd« nicht geöffnet war. */
    tmpfd = dup(newfd);
    if (tmpfd == -1 && errno != EBADF) {
        /* behandelt unerwartete dup()-Fehler */
    }
    /* »oldfd« atomar auf »newfd« duplizieren */
    if (dup2(oldfd, newfd) == -1) {
        /* dup2()-Fehler behandeln */
    }
    /* Nun wird auf close()-Fehler für die Datei, auf die sich
       »newfd« ursprünglich bezog, geprüft */
    if (tmpfd != -1) {
        if (close(tmpfd) == -1) {
            /* close-Fehler behandeln */
        }
    }
SIEHE AUCH¶
close(2), 
fcntl(2), 
open(2)
KOLOPHON¶
Diese Seite ist Teil der Veröffentlichung 3.74 des Projekts Linux-
  
man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler
  gemeldet werden können sowie die aktuelle Version dieser Seite finden
  sich unter 
http://www.kernel.org/doc/man-pages/.
ÜBERSETZUNG¶
Die deutsche Übersetzung dieser Handbuchseite wurde von Aldo Valente
  <aldo@dagobar.rhein.de> und Chris Leick <c.leick@vollbio.de>
  erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General
  Public License Version 3 oder neuer bezüglich der
  Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
  Sie bitte eine E-Mail an <debian-l10n-german@lists.debian.org>.