Frage

Wenn in C Sockets erstellt oder Dateien geöffnet/erstellt werden, ist der Dateideskriptor, der dem Socket/der Datei zugewiesen ist, garantiert der Deskriptor mit dem niedrigsten verfügbaren Wert?Was sagt die C-Spezifikation in dieser Hinsicht über die Zuweisung von Dateideskriptoren aus, wenn überhaupt?

War es hilfreich?

Lösung

Es kann nicht garantiert werden, dass es sich um den niedrigsten Wert handelt, und es hängt von der Implementierung ab (1).Im Allgemeinen verwendet die Routine, die offene Dateideskriptoren zuweist, jedoch eine Methode, die Ihnen die erste offene Datei anzeigt.Es kann jedoch sein, dass unmittelbar nach mehreren niedrigeren Einträgen ein höherer Deskriptor angezeigt wird, als Sie vielleicht erwarten.

Der einzige Grund, warum ich das wissen kann, ist jedoch die Auswahlfunktion, die beschleunigt wird, wenn Sie ihr den höchsten Dateideskriptor übergeben, nach dem Sie suchen müssen.

(1) Beachten Sie, dass Implementierungen, die dem IEEE-Standard folgen, zwar den niedrigsten nicht verwendeten Deskriptor für Dateien garantieren, dies gilt jedoch möglicherweise nicht für Sockets.Nicht jede Implementierung folgt dem IEEE-Standard für open(). Wenn Sie also portable Software schreiben, ist es am besten, sich nicht darauf zu verlassen.

Andere Tipps

Ich glaube nicht, dass Sie es in der C-Spezifikation finden, sondern eher in der Spezifikation für Ihr Betriebssystem.Ich habe unter Linux die Erfahrung gemacht, dass es immer am niedrigsten ist.

Ich werde dem mit einer anderen Frage entgegentreten: Warum ist das wichtig?Sie sollten den Dateideskriptor mit nichts vergleichen (es sei denn, Sie suchen nach stdin/stdout/stderr) oder damit rechnen.Solange es in ein int passt (und das wird garantiert), ist das alles, was Sie wirklich wissen müssen.

Steve M hat recht;C kennt keine Sockets und seine Datei-E/A-Funktionen verwenden einen [Zeiger auf ein] FILE-Objekt, keinen Deskriptor.

@aib open(), close(), lseek(), read(), write() nutzen alle Dateideskriptoren.Ich verwende Streams kaum für I/O.

@Kyle, es ist wichtig wegen Anweisungen wie select().Die Kenntnis des höchsten Deskriptors kann die Leistung verbessern.

Die C-Spezifikation besagt, dass es von der Implementierung abhängt.Wenn Sie sich eine Unix-Implementierung ansehen, heißt es in der Manpage für open(2): „Der von einem erfolgreichen Aufruf zurückgegebene Dateideskriptor ist der Dateideskriptor mit der niedrigsten Nummer, der derzeit nicht für den Prozess geöffnet ist.“

Dies ist hilfreich, wenn Sie versuchen, eine bestimmte Datei an einen bestimmten Deskriptor anzuhängen.Angenommen, Sie möchten stderr nach /dev/null umleiten.Etwas wie

schließen(2);open("/dev/null", O_WRONLY);

sollte es tun.Sie sollten natürlich den von open zurückgegebenen fd erfassen und sicherstellen, dass er 2 ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top