DUP2 -Systemanruf in c

DUP2 -Systemanruf in c
Der DUP2 () Die Systemfunktion wird verwendet, um eine Kopie eines vorhandenen Dateideskriptors zu erstellen. Unter Linux gibt es 3 Standarddateideskriptoren. Sie sind:

Stdin: Dies ist der Standard -Eingabedateideskriptor. Es wird verwendet, um standardmäßig Eingaben vom Terminal zu nehmen. scanf (), getc () usw. Funktionen verwendet Stdin Dateideskriptor, um Benutzereingänge einzunehmen. Der Stdin Der Dateideskriptor wird auch durch die Nummer dargestellt 0.

Stdout: Dies ist der Standardausgabedateideskriptor. Es wird verwendet, um standardmäßig etwas an die Konsole/das Terminal zu drucken. Die weit verbreiteten printf () Funktions verwendet Stdout So drucken Sie Ihre gewünschte Ausgabe an die Konsole/das Terminal. Der Stdout Der Dateideskriptor wird auch durch die Nummer dargestellt 1.

Stderr: Dies ist der Standardfehlerdateideskriptor. Es tut das Gleiche wie das Stdout Dateideskriptor. Der Stderr Der Dateideskriptor wird verwendet, um Fehlermeldungen auf der Konsole/dem Terminal zu drucken. Der einzige Unterschied ist, wenn Sie verwenden Stderr Dateideskriptor zum Drucken der Fehlermeldungen und Stdout Dateideskriptor zum Drucken normaler Ausgänge, dann können Sie sie später trennen. Beispielsweise können Sie die Fehlermeldungen in eine Datei und normale Ausgänge in die Konsole oder eine andere Datei umleiten. Der Stderr Der Dateideskriptor wird auch durch die Nummer dargestellt 2.

Abgesehen von diesen 3 Dateideskriptoren können Sie zusätzliche Dateideskriptoren in C erstellen. Um einen neuen Dateideskriptor zu erstellen, können Sie die verwenden offen() Funktion in c. Der offen() Die Funktion öffnet eine neue Datei, erstellt einen Dateideskriptor für diese Datei und fügt eine andere Nummer als bei 0, 1, 2 zum Dateideskriptor.

Sobald Sie eine Datei mithilfe der Datei geöffnet haben offen() Funktion können Sie die verwenden lesen() Und schreiben() Funktion zum Lesen und Schreiben in den neu erstellten Dateideskriptor.

Stellen Sie sich nun eine Situation vor, in der Sie aus einer bestimmten Datei lesen möchten scanf () oder getc () Funktion und schreiben Sie in eine andere Datei mit printf () Funktion. Dies ist nicht das Standardverhalten der scanf (), getc () Und printf () Funktionen, wie ich zuvor erklärt habe. Standardmäßig, scanf () Und getc () Funktions verwendet Stdin Und printf () Verwendet Stdout Und es gibt keine Möglichkeit, diese Funktionen zu sagen, dass sie andere Dateideskriptoren verwenden sollen. Um dieses Standardverhalten zu ändern, müssen Sie die ersetzen Stdin Und Stdout Dateideskriptoren mit den gewünschten Dateideskriptoren. Das ist was das DUP2 () Systemfunktion. Der DUP2 () Funktion kopiert einen Dateideskriptor zu einem anderen Dateideskriptor.

DUP2 () Syntax und Rückgabewert:

Die Syntax von DUP2 () Funktion ist:

int DUP2 (int old_file_descriptor, int new_file_descriptor);

DUP2 () Funktion kopiert die old_file_descriptor in die new_file_descriptor. Wenn der new_file_descriptor existiert bereits, dann ist es automatisch geschlossen und dann die old_file_descriptor wird darauf kopiert.

Auf Erfolg die DUP2 () Die Funktion gibt den neuen Dateideskriptor zurück. Wenn ein Fehler auftritt, DUP2 () kehrt zurück -1.

Der DUP2 () Die Funktion ist in der Header -Datei definiert Unistd.H.

Sie müssen den Header einschließen Unistd.H in Ihrer C -Quelldatei, um die zu verwenden DUP2 () Funktion wie folgt:

#enthalten

Weitere Informationen finden Sie auf der Mannseite von DUP2 () mit dem folgenden Befehl:

$ MAN DUP2

Beispiel 1:

Erstellen Sie eine neue C -Quelldatei 01_dup2.C und geben Sie die folgenden Codes -Zeilen in der Datei ein.

#enthalten
#enthalten
#enthalten
#enthalten
int main (void)
int nummer1, number2, sum;
int input_fds = open ("./Eingang.txt ", o_rdonly);
if (DUP2 (input_fds, stdin_fileno) < 0)
printf ("kann den Dateideskriptor nicht duplizieren.");
exit (exit_failure);

scanf (" %d %d", & number1 & nummer2);
sum = number1 + number2;
printf (" %d + %d = %d \ n", Nummer1, Nummer2, sum);
return exit_success;

Erstellen Sie nun eine neue Datei Eingang.txt im selben Verzeichnis und in der folgenden Zeile eingeben.

15 41

Das Hauptziel dieses Programms ist es, 2 Ganzzahlzahlen aus dem zu lesen Eingang.txt Datei mit scanf () Funktion, fügen Sie sie hinzu und drucken Sie die Summe.

Zunächst habe ich die erforderlichen Header -Dateien mit den folgenden Codes -Zeilen eingefügt.

#enthalten
#enthalten
#enthalten
#enthalten

Im hauptsächlich() Funktion, ich habe die erforderlichen Variablen definiert.

int nummer1, number2, sum;

Dann öffnete ich die Datei Eingang.txt im Lesed -Modus (O_rdonly) Verwendung der offen() Funktion und speicherte den Dateideskriptor in der Variablen input_fds.

int input_fds = open ("./Eingang.txt ", o_rdonly);

Sobald ich den Dateideskriptor der habe Eingang.txt Datei, ich habe den Dateideskriptor in den Standardeingabedateideskriptor kopiert Stdin_fileno (0) verwendet DUP2 () Funktion. Der Dateideskriptor von Eingang.txt ist jetzt der Standard Stdin Dateideskriptor.

DUP2 (input_fds, stdin_fileno)

Ich könnte auch das schreiben DUP2 () Funktion wie folgt. Das Ergebnis wäre das gleiche. Stdin_fileno Hält den Wert 0, Welches ist der Wert der Stdin Dateideskriptor.

DUP2 (input_fds, 0)

Ich habe auch nachgeprüft DUP2 () Fehler mit den folgenden Zeilen. Wenn ein Fehler auftritt, wird das Programm so eingestellt, dass sie eine Fehlermeldung drucken und beenden.

if (DUP2 (input_fds, stdin_fileno) < 0)
printf ("kann den Dateideskriptor nicht duplizieren.");
exit (exit_failure);

Dann habe ich benutzt scanf () um 2 Zahlen aus dem zu scannen Eingang.txt Datei.

scanf (" %d %d", & number1 & nummer2);

Dann habe ich die Zahlen hinzugefügt und die Summe auf der Konsole/dem Terminal, dem Standard, gedruckt Stdout.

sum = number1 + number2;
printf (" %d + %d = %d \ n", Nummer1, Nummer2, sum);

Wie Sie sehen können, habe ich die erwartete Ausgabe erhalten, sobald ich das Programm ausgeführt habe.

Beispiel 2:

Erstellen Sie eine neue C -Quelldatei 02_dup2.C und geben Sie die folgenden Codes -Zeilen in der Datei ein.

#enthalten
#enthalten
#enthalten
#enthalten
#enthalten
#enthalten
int main (void)
int nummer1, number2, sum;
int input_fds = open ("./Eingang.txt ", o_rdonly);
int output_fds = open ("./Ausgang.txt ", o_wronly | o_creat, s_irusr | s_iwusr);
DUP2 (input_fds, stdin_fileno);
DUP2 (output_fds, stdout_fileno);
scanf (" %d %d", & number1 & nummer2);
sum = number1 + number2;
printf (" %d + %d = %d \ n", Nummer1, Nummer2, sum);
return exit_success;

Erstellen Sie nun eine neue Datei Eingang.txt im selben Verzeichnis und in der folgenden Zeile eingeben.

15 41

In diesem Programm habe ich dasselbe getan wie in Beispiel 1. Der einzige Unterschied ist, dass ich eine neue Datei erstellt habe Ausgang.txt und verwendete den Dateideskriptor der Ausgabe.TXT als Standardeinstellung Stdout Dateideskriptor mit dem DUP2 () Funktion. Nun, die gesamte Ausgabe der printf () Funktion wird an die geschrieben Ausgang.txt Datei.

Ich habe eine neue Datei erstellt und den Dateideskriptor in gespeichert output_fds Variable.

int output_fds = open ("./Ausgang.txt ", o_wronly | o_creat, s_irusr | s_iwusr);

Ich habe auch den Dateideskriptor output -Datei in den STDOut -Dateideskriptor kopiert. Ich habe die vordefinierte Konstante verwendet Stdout_fileno.

DUP2 (output_fds, stdout_fileno);

Stdout_fileno enthält den Wert 1 (Der Standarddateideskriptorwert von Stdout). Also konnte ich den Funktionsaufruf von Dup2 () wie folgt umschreiben. Es würde die gleichen Ergebnisse liefern.

DUP2 (output_fds, 1);

Der Rest des Programms ist der gleiche. Wie Sie sehen können, druckt es nach dem Ausführen des Programms nichts auf der Konsole/dem Terminal.

Das Programm hat jedoch eine neue Datei erstellt Ausgang.txt Datei.

Wie Sie sehen können, wird die Ausgabe in die Datei geschrieben Ausgang.txt.

Wenn Sie alle Fehler schreiben möchten (Stderr) In eine andere Datei können Sie auch einen Dateideskriptor kopieren Stderr Dateideskriptor wie folgt.

DUP2 (ERROR_FDS, STDERR_FILENO);

So benutzt du die DUP2 () Systemanruf in c. Danke, dass du diesen Artikel gelesen hast.