Provided by: manpages-de-dev_2.5-1_all bug

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 Dateideskriptionen (siehe
       open(2)) und teilen sich dadurch Dateiversatz (file offset) und Dateistatusschalter. Falls
       der  Dateiversatz  zum  Beispiel  durch  lseek(2) auf einem der Dateideskriptoren geändert
       wurde, wird der Versatz auch für den anderen verändert.

       Die beiden Dateideskriptoren 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
       Dateideskriptor 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 Dateideskriptor zurück. Im Fehlerfall  wird
       -1 zurückgegeben und errno entsprechend gesetzt.

FEHLER

       EBADF  oldfd ist kein Deskriptor für eine geöffnete Datei.

       EBADF  newfd  liegt  außerhalb  des  erlaubten  Bereichs für Datei-Deskriptoren (siehe die
              Erläuterung von RLIMIT_NOFILE in getrlimit(2)).

       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 enthalten einen ungültigen Wert.

       EINVAL (dup3()) oldfd entsprach newfd.

       EMFILE Die Beschränkung der Anzahl offener Datei-Deskriptoren pro Prozess  wurde  erreicht
              (siehe die Erläuterung von RLIMIT_NOFILE in getrlimit(2)).

VERSIONEN

       dup3()  wurde in Version 2.6.27 zu Linux hinzugefügt; Glibc-Unterstützung ist seit Version
       2.9 verfügbar.

KONFORM ZU

       dup(), dup2(): POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.

       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  4.15  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 https://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>.