C-Programmierung

dup2 Systemaufruf in C

dup2 Systemaufruf in C
Das dup2() 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 standardmäßig verwendet, um Eingaben vom Terminal entgegenzunehmen. scanf(), getc() usw. Funktionen verwendet stdin Dateideskriptor für Benutzereingaben. Das stdin Dateideskriptor wird auch durch die Zahl dargestellt 0.

stdout: Dies ist der Standard-Ausgabedateideskriptor. Es wird verwendet, um standardmäßig etwas an die Konsole/das Terminal zu drucken. Die weit verbreitete printf() Funktion verwendet stdout um Ihre gewünschte Ausgabe an die Konsole/das Terminal zu drucken. Das stdout Dateideskriptor wird auch durch die Zahl dargestellt 1.

stderr: Dies ist der Standard-Fehlerdateideskriptor. Es macht das gleiche wie das stdout Dateideskriptor. Das stderr 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, um normale Ausgaben zu drucken, dann können Sie sie später trennen. Sie können beispielsweise die Fehlermeldungen in eine Datei und normale Ausgaben an die Konsole oder eine andere Datei umleiten. Das stderr Dateideskriptor wird auch durch die Zahl dargestellt 2.

Abgesehen von diesen 3 Dateideskriptoren können Sie in C weitere Dateideskriptoren erstellen. Um einen neuen Dateideskriptor zu erstellen, können Sie den öffnen() Funktion in C. Das öffnen() Funktion öffnet eine neue Datei, erstellt einen Dateideskriptor für diese Datei und hängt eine andere Nummer als . an 0, 1, 2 zum Dateideskriptor.

Sobald Sie eine Datei mit open öffnen öffnen() Funktion können Sie die lesen() und schreiben() Funktion zum Lesen und Schreiben in den neu erstellten Dateideskriptor.

Stellen Sie sich nun eine Situation vor, in der Sie mit aus einer bestimmten Datei lesen möchten scanf() oder getc() Funktion und schreibe in eine andere Datei mit printf() Funktion. Dies ist nicht das Standardverhalten des scanf(), getc() und printf() funktioniert wie ich bereits erklärt habe. Standardmäßig, scanf() und getc() Funktion verwendet stdin und printf() Verwendet stdout und es gibt keine Möglichkeit, diese Funktionen anzuweisen, andere Dateideskriptoren zu verwenden. Um dieses Standardverhalten zu ändern, müssen Sie also das stdin und stdout Dateideskriptoren mit Ihren gewünschten Dateideskriptoren. Das ist was dup2() Systemfunktion tut. Das dup2() Funktion kopiert einen Dateideskriptor in einen 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 die new_file_descriptor bereits existiert, dann wird es automatisch geschlossen und dann die old_file_descriptor wird darauf kopiert.

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

Das dup2() Funktion ist in der Header-Datei definiert unistd.ha.

Sie müssen die Kopfzeile einschließen unistd.ha in Ihrer C-Quelldatei, um die dup2() Funktion wie folgt:

#einschließen

Weitere Informationen finden Sie auf der Manpage von dup2() mit folgendem Befehl:

$ man dup2

Beispiel 1:

Erstellen Sie eine neue C-Quelldatei 01_dup2.c und geben Sie die folgenden Codezeilen in die Datei ein.

#einschließen
#einschließen
#einschließen
#einschließen
 
int main(void)
int Zahl1, Zahl2, Summe;
 
int input_fds = open("./Eingang.txt", O_RDONLY);
 
if(dup2(input_fds, STDIN_FILENO) < 0)
printf("Dateideskriptor kann nicht dupliziert werden.");
beenden(EXIT_FAILURE);

 
scanf("%d %d", &number1, &number2);
 
Summe = Zahl1 + Zahl2;
 
printf("%d + %d = %d\n", Zahl1, Zahl2, Summe);
 
EXIT_SUCCESS zurückgeben;

Erstellen Sie nun eine neue Datei Eingang.TXT im gleichen Verzeichnis und geben Sie die folgende Zeile ein in.

15 41

Das Hauptziel dieses Programms ist es, 2 ganze Zahlen aus dem zu lesen Eingang.TXT Datei mit scanf() Funktion, addiere sie und drucke die Summe the.

Zuerst habe ich die erforderlichen Header-Dateien mit den folgenden Codezeilen eingefügt.

#einschließen
#einschließen
#einschließen
#einschließen

In dem Main() Funktion habe ich die benötigten Variablen definiert.

int Zahl1, Zahl2, Summe;

Dann habe ich die Datei geöffnet Eingang.TXT im schreibgeschützten Modus (O_RDONLY) Verwendung der öffnen() Funktion und speicherte den Dateideskriptor in der Variablen input_fds.

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

Sobald ich den Dateideskriptor des Eingang.TXT Datei habe ich den Dateideskriptor in den Standardeingabedateideskriptor kopiert STDIN_FILENO (0) mit dup2() Funktion. Der Dateideskriptor von Eingang.TXT ist jetzt die Standardeinstellung stdin Dateideskriptor.

dup2(input_fds, STDIN_FILENO)

ich könnte das auch schreiben dup2() Funktion wie folgt. Das Ergebnis wäre das gleiche. STDIN_FILENO hält den Wert 0, was ist der Wert von stdin Dateideskriptor.

dup2(input_fds, 0)

Ich habe auch nachgeschaut dup2() Fehler mit den folgenden Zeilen. Wenn ein Fehler auftritt, ist das Programm so eingestellt, dass es eine Fehlermeldung ausgibt und beendet.

if(dup2(input_fds, STDIN_FILENO) < 0)
printf("Dateideskriptor kann nicht dupliziert werden.");
beenden(EXIT_FAILURE);

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

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

Dann fügte ich die Zahlen hinzu und druckte die Summe auf der Konsole/dem Terminal, der Standardeinstellung stdout.

Summe = Zahl1 + Zahl2;
printf("%d + %d = %d\n", Zahl1, Zahl2, Summe);

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 Codezeilen in die Datei ein.

#einschließen
#einschließen
#einschließen
#einschließen
#einschließen
#einschließen
int main(void)
int Zahl1, Zahl2, Summe;
int input_fds = open("./Eingang.txt", O_RDONLY);
int output_fds = open("./Ausgabe.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
dup2(input_fds, STDIN_FILENO);
dup2(output_fds, STDOUT_FILENO);
scanf("%d %d", &number1, &number2);
Summe = Zahl1 + Zahl2;
printf("%d + %d = %d\n", Zahl1, Zahl2, Summe);
EXIT_SUCCESS zurückgeben;

Erstellen Sie nun eine neue Datei Eingang.TXT im gleichen Verzeichnis und geben Sie die folgende Zeile ein in.

15 41

In diesem Programm habe ich das gleiche gemacht wie in Beispiel 1. Der einzige Unterschied ist, dass ich eine neue Datei erstellt habe Ausgabe.TXT und benutzte den Dateideskriptor von output.txt als Standardeinstellung stdout Dateideskriptor mit dem dup2() Funktion. Nun, die gesamte Ausgabe des printf() Funktion wird in die geschrieben Ausgabe.TXT Datei.

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

int output_fds = open("./Ausgabe.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);

Ich habe auch den Dateideskriptor output_fds in den Dateideskriptor stdout kopiert copied. Ich habe die vordefinierte Konstante verwendet STDOUT_FILENO.

dup2(output_fds, STDOUT_FILENO);

STDOUT_FILENO enthält den Wert 1 (der Standard-Dateideskriptorwert von stdout). Also könnte ich den Funktionsaufruf dup2() wie folgt umschreiben. Es würde zu den gleichen Ergebnissen kommen.

dup2(output_fds, 1);

Der Rest des Programms ist gleich. Wie Sie sehen können, druckt das Programm, sobald ich es ausführe, nichts auf der Konsole/dem Terminal.

Aber das Programm hat eine neue Datei erstellt Ausgabe.TXT Datei.

Wie Sie sehen, wird die Ausgabe in die Datei geschrieben Ausgabe.TXT.

Wenn Sie alle Fehler schreiben möchten (stderr) in eine andere Datei, dann können Sie auch einen Dateideskriptor nach . kopieren stderr Dateideskriptor wie folgt.

dup2(error_fds, STDERR_FILENO);

So verwenden Sie die dup2() Systemaufruf in C. Danke, dass du diesen Artikel gelesen hast.

Installieren Sie das neueste OpenRA-Strategiespiel auf Ubuntu Linux
OpenRA ist eine Libre/Free Real Time Strategy Game Engine, die die frühen Westwood-Spiele wie den Klassiker Command & Conquer: Red Alert Red nachbilde...
Installieren Sie den neuesten Dolphin Emulator für Gamecube & Wii unter Linux
Mit dem Dolphin Emulator können Sie Ihre ausgewählten Gamecube- und Wii-Spiele auf Linux-Personalcomputern (PC) spielen. Als frei verfügbarer Open-So...
So verwenden Sie die GameConqueror-Cheat-Engine unter Linux
Der Artikel enthält eine Anleitung zur Verwendung der GameConqueror-Cheat-Engine unter Linux. Viele Benutzer, die Spiele unter Windows spielen, verwen...