dup(2) System Calls Manual dup(2) BEZEICHNUNG dup, dup2 - dupliziert einen Datei-Deskriptor BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include int dup(int altdd); int dup2(int altdd, int neudd); #define _GNU_SOURCE /* siehe feature_test_macros(7) */ #include /* Definition der O_*-Konstanten */ #include int dup3(int altdd, int neudd, int schalter); BESCHREIBUNG Der Systemaufruf dup() reserviert einen neuen Dateideskriptor, der sich auf die gleiche offene Dateideskription wie der Deskriptor altdd bezieht. (Fur eine Beschreibung von offenen Dateideskriptionen, siehe open(2).) Die neue Dateideskriptornummer ist garantiert der Dateideskriptor mit der niedrigsten Nummer, die in dem aufrufenden Prozess verfugbar war. Nach der erfolgreichen Ruckkehr konnen die alten und neuen Datei-Deskriptoren synonym benutzt werden. Da die zwei Dateideskriptoren sich auf die gleichen offenen Dateideskriptionen beziehen, teilen sie sich dadurch Dateiversatz (file offset) und Dateistatusschalter. Falls der Dateiversatz zum Beispiel durch lseek(2) auf einem der Dateideskriptoren geandert wurde, wird der Versatz auch fur den anderen Dateideskriptor verandert. Die beiden Dateideskriptoren teilen sich keine Datei-Deskriptor-Schalter (den Schalter >>close-on-exec<<). Der Schalter >>close-on-exec<< (FD_CLOEXEC; siehe fcntl(2)) fur das Duplikat ist aus. dup2() Der Systemaufruf dup2() fuhrt dieselben Aufgaben wie dup() durch, verwendet jedoch statt des kleinsten nicht benutzten Dateideskriptors die in neudd angegebene Zahl. Mit anderen Worten, der Dateideskriptor neudd wird angepasst, so dass er sich jetzt auf die gleiche offene Dateideskription wie altdd bezieht. Falls der Dateideskriptor neudd vorher offen war, wird er vor der erneuten Benutzung geschlossen; das Schliessen erfolgt stillschweigend (d.h. es werden mogliche Fehler wahrend des Schliessens nicht durch dup2() gemeldet). Die Schritte zum Schliessen und erneuten Verwenden des Dateideskriptors neudd werden atomar (als logische Einheit) durchgefuhrt. Dies ist wichtig, da der Versuch gleichwertige Funktionalitat mittels close(2) und dup()zu implementieren, Gegenstand von Race Conditions sein konnte, 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: o Falls altdd kein gultiger Datei-Deskriptor ist, schlagt der Aufruf fehl und neudd wird nicht geschlossen. o Falls altdd ein gultiger Datei-Deskriptor ist und neudd den gleichen Wert wie altdd hat, dann tut dup2() nichts und gibt neudd zuruck. dup3() dup3() entspricht dup2(), ausser dass: o Der Aufrufende kann erzwingen, dass der Schalter >>close-on-exec<< fur 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 nutzlich sein konnte. o Falls altdd neudd entspricht, schlagt dup3() mit dem Fehler EINVAL fehl. RUCKGABEWERT Bei Erfolg geben diese Systemaufrufe den neuen Dateideskriptor zuruck. Im Fehlerfall wird -1 zuruckgegeben und errno gesetzt, um den Fehler anzuzeigen. FEHLER EBADF altdd ist kein Deskriptor fur eine geoffnete Datei. EBADF neudd liegt ausserhalb des erlaubten Bereichs fur Datei-Deskriptoren (siehe die Erlauterung von RLIMIT_NOFILE in getrlimit(2)). EBUSY (nur Linux) Dies konnte von dup2() oder dup3() wahrend einer Gleichzeitigkeitsbedingung mit open(2) und dup() zuruckgegeben werden. EINTR Der Aufruf von dup2() oder dup3() wurde von einem Signal unterbrochen; lesen Sie signal(7). EINVAL (dup3()) schalter enthalten einen ungultigen Wert. EINVAL (dup3()) altdd entsprach neudd. EMFILE Die Beschrankung der Anzahl offener Datei-Deskriptoren pro Prozess wurde erreicht (siehe die Erlauterung von RLIMIT_NOFILE in getrlimit(2)). STANDARDS dup() dup2() POSIX.1-2008. dup3() Linux. GESCHICHTE dup() dup2() POSIX.1-2001, SVr4, 4.3BSD. dup3() Linux 2.6.27, glibc 2.9. ANMERKUNGEN Der von dup2 zuruckgegebene Fehler unterscheidet sich von dem, der von fcntl(, F_DUPFD,) zuruckgegeben wird, wenn neudd ausserhalb des Bereiches ist. Weiterhin gibt dup2 auf einigen Systemen EINVAL wie F_DUPFD zuruck. Falls neudd geoffnet war, sind alle Fehler verlorengegangen, die in dieser Zeit an close(2) gemeldet worden waren. Falls dies von Bedeutung ist, ist die korrekte Herangehensweise, - sofern das Programm nicht in einem einzigen Thread lauft und keine Dateideskriptoren in Signalverarbeitungsprogrammen reserviert -, neudd vor dem Aufruf von dup2() wegen der oben beschriebenen Race Conditions nicht zu schliessen. Stattdessen kann Code wie der folgende verwendet werden: /* Erhalt ein Duplikat von >>neudd<<, das nachfolgend benutzt werden kann, um auf Fehler von close() zu prufen. Ein EBADF-Fehler bedeutet, dass >>neudd<< nicht geoffnet war. */ tmpfd = dup(newfd); if (tmpfd == -1 && errno != EBADF) { /* behandelt unerwartete dup()-Fehler */ } /* >>altdd<< atomar auf >>neudd<< duplizieren */ if (dup2(oldfd, newfd) == -1) { /* dup2()-Fehler behandeln */ } /* Nun wird auf close()-Fehler fur die Datei, auf die sich >>neudd<< ursprunglich bezog, gepruft. */ if (tmpfd != -1) { if (close(tmpfd) == -1) { /* close-Fehler behandeln */ } } SIEHE AUCH close(2), fcntl(2), open(2), pidfd_getfd(2) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Aldo Valente , Chris Leick und Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 dup(2)