DUP (Systemanruf)
Im Unix-artig Betriebssysteme, DUP (kurz für "doppelt") und DUP2 Systemaufrufe Erstellen Sie eine Kopie eines gegebenen Dateideskriptor. Dieser neue Deskriptor verhält sich tatsächlich nicht wie eine Kopie, sondern wie eine alias des alten.
C Library POSIX Definition
Die DUP- und DUP2 -Anrufe werden durch die standardisiert Posix Spezifikation.[1] Ähnlich (folgt der Logik) wie Zeiger, ist die neue Dateibeschreibung lediglich ein Alias zum alten, wobei beide Dateideskriptoren austauschbar verwendet werden können. Beide Dateideskriptoren in einem DUP () -Systemanruf beziehen sich auf dieselbe offene Dateibeschreibung, was bedeutet, dass sie Datei -Offset- und Dateistatus -Flags freigeben. Ähnlich, aber nicht identisch mit der in Zeigern verwendeten Logik, flaches oder tiefes Kopieren oder Verweise, Änderungen des Offsets an einem der Dateideskriptoren ändert es für den anderen Dateideskriptor. Bei der Verwendung von DUP () teilen sich die beiden Dateideskriptoren nicht dasselbe Dateideskriptor -Flags. Im Anrufverfahren wird der niedrigste nummerierte nicht verwendete Dateideskriptor für die neue Dateideskriptornummer verwendet. Bei Verwendung des DUP2 () Systemanruf Es führt dieselbe Aufgabe wie DUP () aus, mit Ausnahme der Verwendung der in der NewFD -Variablen des Aufrufs angegebenen Dateideskriptorennummer. Der letzte Systemaufruf in dieser Familie von Funktionen ist DUP3 (); Dies ist das gleiche wie mit DUP2 (), wenn OldFD gleich neufd ist, der Systemaufruf schlägt bei einem Fehler von Einval fehl und der Anrufer kann das Nahverzerrungs-Flag erzwingen, durch Angabe von O_CLOEXEC in Flags festgelegt zu werden.[2] DUP3 () wurde offiziell zugesetzt Linux Kernel Version 2.6.27 (GLIBC -Unterstützung ist auf Version 2.9 und höher verfügbar).
int DUP (int Oldfd); int DUP2 (int Oldfd, int newfd);
Der erstere verteilt den ersten verfügbaren Deskriptor genau wie offen() verhält; Eine alternative Möglichkeit, einen Dateideskriptor an einen nicht spezifizierten Ort zu duplizieren, ist die fcntl Systemanruf mit F_DUPFD
Befehl.
Letzteres legt die Kopie in Newfd. Wenn Newfd geöffnet ist, ist es abgeschlossen Erste.
DUP2 für Eingangs-/Ausgangsumleitung
Unix -Muscheln verwenden DUP2 Für Eingabe/Ausgabe Umleitung. Zusammen mit Rohr()
, es ist ein Werkzeug, auf dem UNIX Pipes vertrauen.
Das folgende Beispiel verwendet verwendet Rohr()
und DUP ()
um zwei separate Prozesse zu verbinden (Programm1 und Programm2) Verwenden UNIX Pipes:
#enthalten #enthalten #enthalten / * Funktionsprototypen *// Leere sterben(Const verkohlen*); int hauptsächlich(int argc, verkohlen **argv) { int PDES[2]; pid_t Kind; wenn(Rohr(PDES) == -1) sterben("Rohr()"); Kind = Gabel(); wenn(Kind == (pid_t) (-1)) sterben("Gabel()"); / * gabel fehlgeschlagen */ wenn(Kind == (pid_t)0) { / * Kinderprozess */ nah dran(1); / * Schließen Sie Stdout */ wenn(DUP(PDES[1])) == -1) sterben("DUP ()"); / * jetzt stdout und pdes [1] sind gleichwertig (DUP gibt den niedrigsten freien Deskriptor zurück) *//// wenn((Execlp("Programm1", "Programm1", "arg1", NULL)) == -1) sterben("execlp ()"); _Ausfahrt(Exit_success); } anders { / * Elternprozess */ nah dran(0); / * Schließen Sie Stdin *//// wenn(DUP(PDES[0])) == -1) sterben("DUP ()"); / * jetzt stdin und pdes [0] sind äquivalent (DUP gibt den niedrigsten freien Deskriptor zurück) *//// wenn((Execlp("Programm2", "Programm2", "arg1", NULL)) == -1) sterben("execlp ()"); Ausfahrt(Exit_success); } Rückkehr 0; } Leere sterben(Const verkohlen *Nachricht) { Perror(Nachricht); Ausfahrt(Exit_failure); }
Siehe auch
- Dateideskriptor- Wie es funktioniert und andere Funktionen im Zusammenhang mit Open
Verweise
- ^ "DUP, DUP2". openGroup.org.
- ^ "Linux Man Pages".
- Erweiterte Programmierung in der UNIX -Umgebung von W. Richard Stevens ISBN81-7808-096-6