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