Dateideskriptor in C

Waqar Aslam 12 Oktober 2023
  1. Ein Überblick über Dateideskriptoren
  2. Dateideskriptoren in der Programmiersprache C
  3. Systemaufrufe mit Dateideskriptor in C
Dateideskriptor in C

In diesem Artikel wird der Dateideskriptor in der Programmiersprache C erläutert.

Ein Überblick über Dateideskriptoren

Ein Dateideskriptor ist eine Zahl, die verwendet werden kann, um eine geöffnete Datei im Betriebssystem eines Computers eindeutig zu identifizieren. Es beschreibt eine Datenressource und die Methoden, die verwendet werden können, um darauf zuzugreifen.

Dateideskriptoren stellen uns verschiedene Methoden zur Verfügung, um auf Dateien zuzugreifen, wie z. B. open, close, read und write. Ein Dateideskriptor ist in seiner einfachsten Form eine ganze Zahl.

Jede geöffnete Datei erhält ihre Nummer. Wir nennen es einen Dateideskriptor.

Ein Dateideskriptor wird von der Funktion open() zurückgegeben, nachdem sie zum Öffnen einer Datei verwendet wurde. Sobald dies erledigt ist, können wir diesen Dateideskriptor verwenden, um weitere Aktionen für diese Datei auszuführen.

Wenn wir beispielsweise Daten aus der geöffneten Datei lesen möchten, stellen wir den Dateideskriptor als Eingabe für die Funktion bereit, die Daten liest.

Dateitabelleneintrag: Wenn ein Prozess das Öffnen einer Datei anfordert, werden die Dateitabelleneinträge als eine Struktur im Speicher gebildet, die als Proxy für die geöffnete Datei fungiert. Diese Einträge sind für die Verwaltung des Dateispeicherorts verantwortlich.

Dateideskriptoren in der Programmiersprache C

Standardeingabe (STDIN), Standardausgabe (STDOUT) und Standardfehler (STDERR) sind die ersten drei Dateideskriptoren, die standardmäßig auf einem Unix-ähnlichen Betriebssystem verwendet werden.

Wenn ein Prozess beginnt, öffnet sich die Dateideskriptorentabelle für diesen Prozess automatisch mit den Einträgen fd (Dateideskriptor) 0, 1 und 2. Jedes dieser drei fd verweist auf ein Element in der Dateitabelle für eine Datei namens /dev/tty.

Name Dateideskriptor Beschreibung
stdin 0 Standardeingabe
stdout 1 Standardausgabe
stderr 2 Standart Fehler

Systemaufrufe mit Dateideskriptor in C

Ein Systemaufruf ist eine Methode, durch die ein Betriebssystem seine Dienste Benutzeranwendungen über eine Anwendungsprogrammierschnittstelle (API) zugänglich macht.

Die folgenden Arten von E/A-Systemaufrufen werden in diesem Zusammenhang verwendet.

open() Aufruf unter Verwendung des Dateideskriptors

Der Name der Datei, die Sie öffnen möchten, wird als erster Parameter an diese Methode gesendet. Danach bieten wir einige weitere Optionen an, um den Öffnungsmodus zu bestimmen.

Der Rückgabewert wird auf -1 gesetzt, wenn die Datei nicht geöffnet werden kann. Bevor wir also weitere Aktivitäten an der geöffneten Datei ausführen, müssen wir den von der Methode open() zurückgegebenen Wert überprüfen.

Wenn es einen Wert von -1 hat, wissen wir, dass die Methode open() die Datei nicht erfolgreich öffnen konnte.

Nehmen wir ein Beispiel, um den Aufruf open() zu implementieren.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[]) {
  int fileDescriptor;
  char buff[1000];

  if ((fileDescriptor = open("abc.txt", O_CREAT | O_RDONLY)) == -1) {
    printf("File Open Failed\n");
    exit(0);
  } else {
    printf("File Opened Successfully\n");
    printf("File Descriptor: %d\n", fileDescriptor);
  }
}

Ausgang:

File Opened Successfully
File Descriptor: 3

Ganz am Anfang der Funktion main wurde von uns eine Integer-Variable mit dem Namen fileDescriptor definiert. Dies soll verwendet werden, um den Wert des Dateideskriptors zu speichern.

Danach haben wir eine if-Anweisung verwendet, um den von der open-Funktion zurückgegebenen Wert zu testen. Wenn es -1 ist, werden wir die Anwendung beenden und eine Fehlermeldung anzeigen.

Wenn nicht, können wir das Programm fortsetzen. Der String abc.txt wird als erste Eingabe an die open-Funktion gesendet.

Dies ist der tatsächliche Name der Datei, die gespeichert wird. Als nächstes haben wir angegeben, dass O_RDONLY verwendet werden sollte.

Dies zeigt an, dass wir die Datei im schreibgeschützten Modus öffnen möchten. Auch wenn die Datei nicht existiert, sollte sie die Datei mit O_CREAT erstellen.

Das Folgende sind einige andere Argumente, die wir verwenden können.

  1. O_WRONLY: Dadurch wird die Datei geöffnet, sodass Sie nur darauf schreiben können.
  2. O_RDWR: Mit dieser Option können Sie gleichzeitig Dateien zum Lesen und Schreiben öffnen.

close() Aufruf unter Verwendung des Dateideskriptors

Dies geschieht, damit der Zugriff auf das Dateisystem beendet wird. Wenn ein Programm diese Systemfunktion aufruft, zeigt es an, dass es die Datei nicht mehr benötigt.

Folglich werden die Puffer geleert, die Dateiinformationen modifiziert und die der Datei zugeordneten Ressourcen werden freigegeben.

int close(int fd);

read() Aufruf unter Verwendung des Dateideskriptors

Der Dateideskriptor ist der erste Parameter, den es akzeptiert. Als Argument müssen wir den Deskriptor angeben, der beim Öffnen der Datei verwendet wurde.

Als zweiter Parameter wird ein Zeiger gesendet. Die Funktion read holt die Daten aus der angegebenen Datei und speichert sie dort, wo Sie sie angewiesen haben.

Als Wert dieses Zeigers können wir die Adresse des zuvor zugewiesenen Pufferbereichs liefern. Der dritte Parameter gibt die Anzahl der Bytes an, die aus der Datei gelesen werden sollen.

Die Anzahl der Bytes, die erfolgreich aus dieser Datei gelesen wurden, wird von dieser Datei zurückgegeben, wenn die Datei erfolgreich gelesen wurde. Wenn dies nicht gelingt, wird der Wert -1 zurückgegeben.

Syntax:

ssize_t read(int fd, void *buf, size_t count);

Ein Beispiel für das Lesen einer Datei mit einem Dateideskriptor lautet wie folgt:

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[]) {
  int fileDescriptor;
  char buff[1000];

  if ((fileDescriptor = open("abc.txt", O_RDONLY)) == -1) {
    printf("File Opening Failed\n");
    exit(0);
  } else {
    printf("File Opened Successfully\n");
    printf("File Descriptor: %d\n", fileDescriptor);

    if (read(fileDescriptor, buff, sizeof(buff)) == -1) {
      printf("Error while reading file\n");
      exit(0);
    } else {
      printf("Text of the File: %s\n", buff);
    }
  }
  return 0;
}

Ausgang:

File Opened Successfully
File Descriptor: 3
Text of the File: DelftStack has the solutions to all the programming-related problems
Waqar Aslam avatar Waqar Aslam avatar

I am Waqar having 5+ years of software engineering experience. I have been in the industry as a javascript web and mobile developer for 3 years working with multiple frameworks such as nodejs, react js, react native, Ionic, and angular js. After which I Switched to flutter mobile development. I have 2 years of experience building android and ios apps with flutter. For the backend, I have experience with rest APIs, Aws, and firebase. I have also written articles related to problem-solving and best practices in C, C++, Javascript, C#, and power shell.

LinkedIn

Verwandter Artikel - C File