Provided by: manpages-de-dev_4.13-4_all bug

BEZEICHNUNG

       dup, dup2 - dupliziert einen Datei-Deskriptor

ÜBERSICHT

       #include <unistd.h>

       int dup(int altdd);
       int dup2(int altdd, int neudd);

       #define _GNU_SOURCE           /* siehe feature_test_macros(7) */
       #include <fcntl.h>    /* Definitionen der O_*-Konstanten abrufen */
       #include <unistd.h>

       int dup3(int altdd, int neudd, int schalter);

BESCHREIBUNG

       Der  Systemaufruf  dup()  erzeugt  eine  Kopie des Dateideskriptors altdd 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 neudd angegebene Zahl. Falls  der  Dateideskriptor  neudd  vorher
       bereits geöffnet wurde, wird er stillschweigend geschlossen, bevor er erneut benutzt wird.

       Die  Schritte zum Schließen und erneuten Verwenden des Dateideskriptors neudd 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  neudd  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  altdd  kein  gültiger  Datei-Deskriptor  ist,  schlägt  der  Aufruf  fehl  und neudd wird nicht
          geschlossen.

       *  Falls altdd ein gültiger Datei-Deskriptor ist und neudd den gleichen Wert  wie  altdd  hat,  dann  tut
          dup2() nichts und gibt neudd 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 altdd neudd 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  altdd ist kein Deskriptor für eine geöffnete Datei.

       EBADF  neudd 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()) altdd entsprach neudd.

       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 neudd außerhalb des Bereiches ist. Weiterhin gibt dup2 auf einigen Systemen EINVAL wie F_DUPFD
       zurück.

       Falls neudd 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  –,  neudd  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 »neudd«, das nachfolgend benutzt
              werden kann, um auf Fehler von close() zu prüfen. Ein
              EBADF-Fehler bedeutet, dass »neudd« nicht geöffnet war. */

           tmpfd = dup(neudd);
           if (tmpfd == -1 && errno != EBADF) {
               /* behandelt unerwartete dup()-Fehler */
           }

           /* »altdd« atomar auf »neudd« duplizieren */

           if (dup2(altdd, neudd) == -1) {
               /* dup2()-Fehler behandeln */
           }

           /* Nun wird auf close()-Fehler für die Datei, auf die sich
              »neudd« ursprünglich bezog, geprüft */

           if (tmpfd != -1) {
               if (close(tmpfd) == -1) {
                   /* close-Fehler behandeln */
               }
           }

SIEHE AUCH

       close(2), fcntl(2), open(2), pidfd_getfd(2)

KOLOPHON

       Diese Seite ist Teil der Veröffentlichung  5.10  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>, Chris Leick
       <c.leick@vollbio.de> und Helge Kreutzmann <debian@helgefjell.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  die
       Mailingliste der Übersetzer.

Linux                                           1. November 2020                                          DUP(2)