dup

DUP(2)                     Linux-Programmierhandbuch                    DUP(2)



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 5.02 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>.



Linux                         15. September 2017                        DUP(2)