2016-07-11 4 views
0

Ich bin ein Neuling, der gerade begann, Low-Level-Zeug und C zu lernen. Das könnte eine dumme Frage sein, aber ich bin verblüfft über Dateideskriptoren. Ich verstehe, dass wir den Systemaufruf dup2() oder dup() benötigen, um sie zu kopieren. Aber warum können wir sie nicht einfach kopieren, indem wir alten Variablen alte Werte zuweisen? Zum Beispiel, warum können wir dieWarum können wir Dateideskriptoren nicht kopieren, indem wir einfach den Wert neuen Variablen zuweisen?

int f[2]; 
pipe(f); // I call pipe just to create two file descriptors, nothing special 
int new_descriptor = f[0]; // this line is where I'm confused 

ist, weil die ganzen Zahlen, dass f [0], f [1] haben spezifische Bedeutung und ist eine Art von kodierten? Danke!

+0

'dup' erstellt und gibt ein neues fd zurück, das auf dieselbe Datei verweist. Der fd ist ein Index in die Prozessdateitabelle, so dass "dup" tatsächlich den nächsten offenen Punkt in der Prozessdateitabelle findet, den Zeiger auf die Dateistruktur (im Kernel) an diesen Punkt kopiert und den Index an den Benutzerbereich zurückgibt. – evaitl

Antwort

4

Sie können Dateideskriptoren nach Zuweisung kopieren. Was Sie nicht tun können, ist die Datei zu ändern, die eine bestimmte Datei-Deskriptor-Nummer (wie 1) verweist - dazu benötigen Sie dup() oder dup2() - oder fcntl() oder close(). (Anrufe wie open() oder pipe() wirken sich nicht auf alle bereits geöffneten Datei-Deskriptoren, sie eine neue bisher nicht in Gebrauch zurückzukehren.)

Ein Weg, um es zu betrachten: es gibt nichts unverwechselbares über die Variable, die die Datei enthält Deskriptornummer - jede beliebige int Variable, die dieselbe Nummer hat, kann als Dateideskriptor verwendet werden. Das Ändern der Datei, auf die sich der Dateideskriptor bezieht, ist jedoch eine viel komplexere Aufgabe und erfordert einen Systemaufruf.

+0

Ich bekomme es jetzt! Vielen Dank für die klare Erklärung! :) –

+0

Große Antwort. Ich würde hinzufügen, dass das Aufrufen von "dup" oder "dup2" den Verweiszähler für eine geöffnete Datei erhöht, sodass das Schließen des ursprünglichen Dateideskriptors die Datei nicht schließt, auf die mit dem neuen Dateideskriptor, den 'dup' zurückgegeben hat, zugegriffen werden kann Datei wird nur geschlossen, wenn der Referenzzähler 0 erreicht. – Myst

+0

@Myst: Korrekt, aber ich hatte vor, den Unterschied zwischen offenen Dateideskriptoren und offenen Dateibeschreibungen zu vermeiden, die beide von einer 'offenen Datei' getrennt sind, da eine einzelne Datei mehrmals mit verschiedenen offenen Dateideskriptoren geöffnet werden könnte . –

Verwandte Themen