2013-08-29 12 views
7

Ich interessiere mich für die gültigen Werte, die ich für einen Dateideskriptor erwarten kann.Was sind die möglichen Werte für Dateideskriptoren?

Bitte lassen Sie mich ein wenig erklären. Ich weiß, dass, zum Beispiel, wenn ich #include <unistd.h> auf meinem Linux-System verwende, dann einen Anruf eine Datei zum Lesen zu öffnen:

int fileDescriptor; 
fileDescriptor = open("/some/filename",O_RDONLY); 

ein Fehler kann auftreten, und ich erhalte -1 als Ergebnis.
Zufälligerweise muss die (-1) negative etwas von besonderer Bedeutung haben. Sind alle anderen Werte gültige Dateideskriptoren? d.h. auch negative wie -2 und -1023?

Unter der Annahme, dass int 4 Bytes (sizeof(int)==4), dann würde

(-1) = 10000000 0000000 00000000 00000001 

wäre die einzige detektierbare ungültige Dateideskriptor sein? würden andere mögen:

  • (0) = 00000000 0000000 00000000 00000000
  • (-2) = 10000000 0000000 00000000 00000010
  • (2) = 00000000 0000000 00000000 00000010

ok sein? Da der Dateideskriptor 4 Bytes speichern könnte, hätte ich daher maximal (2^(8 * 4) -1) gültige Dateideskriptoren und folglich wäre dies die maximale Anzahl von Dateien, die ich geöffnet haben kann, richtig?

Um es schlicht wieder:

Was soll ich einen (gültiger) Dateideskriptors erwarten zu sein?

ein beliebiger Wert, aber -1?

+0

'Datei-Deskriptor, eine kleine, ** nichtnegative Ganzzahl ** für folgende Systemaufrufe' siehe man 2 offen –

+0

Siehe [diese Frage] (https://stackoverflow.com/questions/17931583/maximum-number- of-files-das-kann-open-by-c-fopen-in-linux) für die maximale Anzahl von Dateien/Dateideskriptoren, die geöffnet werden können. – jotik

Antwort

12

Vom man page:

open() liefert einen Dateideskriptor, ein kleines, nicht negative ganze.

und dann:

open() und creat() den neuen Dateideskriptor zurückkehren, oder -1, wenn ein Fehler aufgetreten

+0

Ich schlage vor, klarzustellen, dass "klein" weniger bedeutet als RLIMIT_NOFILE (wenn das immer der Fall ist). – Praxeolitic

1

Hier ist, was ein Linux manual page sagt:

open() und creat() den neuen Dateideskriptor zurück oder -1, wenn ein Fehler aufgetreten ist (in diesem Fall errno entsprechend eingestellt ist).

Andere Systeme können im Fehlerfall andere negative Werte zurückgeben.

2

Wenn open scheitern, gibt sie -1 oder 0xffffffff. Es hat keinen Sinn, aber open fehlgeschlagen:

Nach erfolgreichem Abschluss wird die Funktion die Datei öffnen und eine nicht negative ganze Zahl, die den niedrigsten Nummer nicht verwendeten Dateideskriptor zurück. Andernfalls wird -1 zurückgegeben und errno auf gesetzt, um den Fehler anzuzeigen. Wenn die Funktion -1 zurückgibt, dürfen keine Dateien erstellt oder geändert werden.

Die Störungsursache in errno gespeichert ist, können Sie seinen Wert lesen und überprüfen, ob es eine der möglichen Ausfälle ist Gründe EACCES, EEXIST, EINTR .. etc, oder einfach nur perror verwenden, um die Fehlermeldung zu drucken.

1

Mögliche Werte für Dateideskriptoren reichen von 0 bis 1023 für Linux-Systeme (32-Bit- oder 64-Bit-System).

Sie können keinen Dateideskriptor mit einem Wert größer als 1023 erstellen. Im Falle eines Dateideskriptors mit dem Wert 1024 wird ein Fehler von EBADF (beschädigter Dateideskriptor, Fehler Nr. 9) zurückgegeben.

Wenn ein negativer Wert des Dateideskriptors zurückgegeben wird, zeigt dies an, dass ein Fehler aufgetreten ist.

+4

Beachten Sie, dass 1024 nur der übliche Standardwert für RLIMIT_NOFILE (ulimit -n) ist. Wenn Sie das erhöhen, unterstützt es mehr als 1024 Dateien pro Prozess. (Relevant ist auch das systemweite, im Gegensatz zu pro-process, Datei-Deskriptor-Limit - dies wird von der fs.file-max-sysctl-Regler gesteuert) –

Verwandte Themen