Was bedeutet fd bei der Eingabe: int fd = open ("Datei") ;?

8

Ich betrachte I / O-Operationen in C ++ und ich habe eine Frage. Beim Öffnen einer Datei wie:

%Vor%

Wie kann die Variable fd eine Datei als Ganzzahl darstellen, wenn sie an die Methode open übergeben wird? Repräsentiert es eine Datei im aktuellen Ordner? Wenn ich die'fd'-Variable drucke, druckt es 3. Was bedeutet das?

Ps. Ich weiß, dass es mehrere andere Möglichkeiten gibt, mit Dateien umzugehen, wie zB stdio.h, fstream etc, aber das ist außerhalb des Umfangs dieser Frage. Ds.

    
Rox 31.08.2012, 11:55
quelle

5 Antworten

10
  

Wie kann die Variable fd eine Datei als Ganzzahl darstellen, wenn sie an die offene Methode übergeben wird?

Es ist ein Handle, das die geöffnete Datei identifiziert; Es wird allgemein als Dateideskriptor bezeichnet, daher der Name fd .

Wenn Sie die Datei öffnen, erstellt das Betriebssystem einige Ressourcen, die für den Zugriff benötigt werden. Diese werden in einer Art Datenstruktur (vielleicht einem einfachen Array) gespeichert, die eine Ganzzahl als Schlüssel verwendet. Der Aufruf von open gibt diese ganze Zahl zurück, so dass das Betriebssystem sie beim Übergeben von read verwenden kann, um die erforderlichen Ressourcen zu finden.

  

Repräsentiert es eine Datei im aktuellen Ordner?

Es repräsentiert die Datei, die Sie geöffnet haben; Der Dateiname war argv[1] , das erste der Argumente, die beim Start an das Programm übergeben wurden. Wenn diese Datei nicht existiert oder open aus irgendeinem Grund fehlgeschlagen ist, hat sie den Wert -1 und repräsentiert keine Datei. Sie sollten das wirklich überprüfen, bevor Sie versuchen, etwas damit zu tun.

  

Wenn ich die Variable fd ausdruck, druckt sie 3. Was bedeutet das?

Es hat keine besondere Bedeutung; aber es hat diesen Wert, weil es die vierte Datei (oder dateiähnliche Sache) war, die nach den Eingabe- (0), Ausgabe- (1) und Fehler- (2) Datenströmen geöffnet wurde, die von cin , cout verwendet werden. und cerr in C ++.

    
Mike Seymour 31.08.2012, 12:07
quelle
6

Weil dies der Index der Ressourcentabelle ist, die für Ihren aktuellen Prozess gespeichert ist.

Jeder Prozess hat eine eigene Ressourcentabelle, daher müssen Sie den Index nur an read/write/etc function

übergeben
  
    

Im Allgemeinen ist ein Dateideskriptor ein Index für einen Eintrag in einer Kernel-residenten Datenstruktur, der die Details aller geöffneten Dateien enthält. In POSIX wird diese Datenstruktur als Dateideskriptortabelle bezeichnet, und jeder Prozess hat seine eigene Dateideskriptortabelle. Die Benutzeranwendung übergibt den abstrakten Schlüssel über einen Systemaufruf an den Kernel, und der Kernel greift auf der Grundlage des Schlüssels im Namen der Anwendung auf die Datei zu. Die Anwendung selbst kann die Dateideskriptortabelle nicht direkt lesen oder schreiben.

  

aus: Ссылка

    
dynamic 31.08.2012 11:58
quelle
2

open () gibt den Dateideskriptor der Datei zurück, die vom C-Typ int ist. Um mehr über den Dateideskriptor zu erfahren, lesen Sie Ссылка .

    
Aduait Pokhriyal 31.08.2012 12:03
quelle
0

"fd" steht für den Dateideskriptor. Es ist ein Wert, der eine Datei identifiziert. Es ist oft ein Index (in der globalen Tabelle), ein Offset oder ein Zeiger. Verschiedene APIs verwenden unterschiedliche Typen. WinAPI zum Beispiel verwendet verschiedene Arten von Handles (HANDLE, HGDI, etc.), die im Wesentlichen typedefs für int / void * / long sind, und so weiter.

Das Benutzen von nackten Typen wie "int" ist normalerweise keine gute Idee, aber wenn die Implementierung es dir sagt (wie in diesem Fall POSIX), solltest du es behalten.

    
kmdv 31.08.2012 12:04
quelle
0

Die vereinfachte Antwort ist, dass fd nur ein Index in ein Array von Dateideskriptoren ist.

Wenn die meisten Prozesse gestartet werden, erhalten sie zunächst drei offene Dateideskriptoren: stdin (0), stdout (1) und stderr (2). Wenn Sie also Ihre erste Datei öffnen, ist der nächste verfügbare Array-Eintrag 3.

    
mah 31.08.2012 12:04
quelle

Tags und Links