Frage

Ich verfolgte eine Oracle-Prozess, und finden es zunächst eine Datei /etc/netconfig als Datei-Handle 11 öffnen und es dann duplizieren als 256 von fcntl mit dem Parameter F_DUPFD Aufruf und dann close die ursprüngliche Datei-Handle 11. Später las er Datei-Handle 256 verwenden. Also, was ist der Punkt, die Datei-Handle zu duplizieren? Warum nicht einfach die Arbeit an der ursprünglichen Datei-Handle?

12931:   0.0006 open("/etc/netconfig", O_RDONLY|O_LARGEFILE)    = 11
12931:   0.0002 fcntl(11, F_DUPFD, 0x00000100)                  = 256
12931:   0.0001 close(11)                                       = 0
12931:   0.0002 read(256, " # p r a g m a   i d e n".., 1024)   = 1024
12931:   0.0003 read(256, " t s           t p i _ c".., 1024)   = 215
12931:   0.0002 read(256, 0x106957054, 1024)                    = 0
12931:   0.0001 lseek(256, 0, SEEK_SET)                         = 0
12931:   0.0002 read(256, " # p r a g m a   i d e n".., 1024)   = 1024
12931:   0.0003 read(256, " t s           t p i _ c".., 1024)   = 215
12931:   0.0003 read(256, 0x106957054, 1024)                    = 0
12931:   0.0001 close(256)                                      = 0
War es hilfreich?

Lösung

Als Nebenwirkung, sie sind Datei Deskriptoren anstatt Datei Griffe . Letztere sind eine C-Funktion mit fopen verwendet und seine Brüder während Deskriptoren mehr sind Unixy, für die Verwendung mit open et al.

Interessant. Der einzige Grund, dass in den Sinn kommt, ist, dass einige andere Stück Code einen besonderen Bedarf für den Dateideskriptor 256. Ich vermute nur Oracle die bizarren Gründen würde wissen, dass sein muss. In jedem Fall sind Sie nicht garantiert 256 zu erhalten, erhalten Sie die Datei zuerst verfügbar größer Dateideskriptor als oder gleich diese Zahl.


Von etwas Untersuchung (ich weiß nicht, alle kleines Ding über die Innereien von UNIX aus der Spitze von meinem Kopf), gibt es Attribute, die zu einer Gruppe von duplizierten Deskriptoren gehören wie Dateiposition und Zugriffsmodus. Es gibt noch andere Attribute, die zu einem gehören einzelne Dateideskriptor, auch wenn dupliziert, wie der close-on-exec-Flag in GNULib.

Doing ein Duplikat (entweder mit dup, dup2 oder Ihren fcntl) könnte ein Weg sein, zwei Deskriptoren zu erstellen, einen mit verschiedenen Dateideskriptors Attributen, aber ich kann nicht sehen, dass der Fall in Ihrer Frage ist, da der erste Deskriptor geschlossen sowieso. Wie Sie sagen, warum nicht nur den niedrigen Descriptor verwenden?

Interessanterweise, wenn Sie für netconfig f_dupfd google, werden Sie ähnliche Spuren sehen, wo der fcntl versagt und es weiterhin, dass die Datei mit dem niedrigen Descriptor zu lesen, damit meine Gedanken zu diesem Thema sind, dass dies ein Versuch ist, niedrige Filedeskriptoren zu erhalten als viel wie möglich. Zum Beispiel:

4327:   open("/etc/netconfig", O_RDONLY|O_LARGEFILE)    = 4
4327:   fcntl(4, F_DUPFD, 0x00000100)                   Err#22 EINVAL
4327:   read(4, " # p r a g m a   i d e n".., 1024)     = 1024
4327:   read(4, " t s           t p i _ c".., 1024)     = 215
4327:   read(4, 0x00296B80, 1024)                       = 0
4327:   lseek(4, 0, SEEK_SET)                           = 0
4327:   read(4, " # p r a g m a   i d e n".., 1024)     = 1024
4327:   read(4, " t s           t p i _ c".., 1024)     = 215
4327:   read(4, 0x00296B80, 1024)                       = 0
4327:   close(4)                                        = 0

Vielleicht ist die Software hat einen Byte-Array von Filedeskriptoren irgendwo, dass die begrenzt, so versucht es andere Dateien über das 255-Limit zu bewegen.

Aber wirklich, das ist eine Vermutung gerade auf dem Teil (obwohl ich es relativ intelligente Vermutungen denken mag). Denken Sie auch daran, dass es nicht sein kann Oracle selbst dies zu tun. Das netconfig Zeug ist in vielen Orten verwendet, so dass es einig zugrunde liegende Bibliothek, das zu tun sein kann, vor allem in Anbetracht der Tatsache, dass die meisten der oben genannten Web-Hits waren nicht Oracle-spezifische (ftp, remsh und so weiter).

Andere Tipps

Auf einigen Systemen wie Solaris, Standard-I / O mit FILE funktioniert nur mit Filedeskriptoren 0-255, weil seine Implementierung der Dateistruktur verwendet eine 8-Bit-Integer anstelle von int. Wenn ein Programm eine Menge von Datei-Deskriptoren verwendet, dann ist es zu reservieren Filedeskriptoren nützlich 3-255 fnctl mit (fd, F_DUPFD, 256). Ansonsten Funktionen wie fopen (), freopen () und fdopen () schlägt fehl, wenn Sie 256 Dateien öffnen.

Hier ist ein weiteres Beispiel, wenn eine Technik der Reservierung mit niedrigeren Nummern Dateideskriptoren benötigt wird.

Es sei angenommen, daß ein Prozeß eine große Anzahl von Dateideskriptor öffnet z.B. es nimmt mehr als 1024 gleichzeitige Socket-Verbindungen. Zur gleichen Zeit verwendet der Prozess auch Dritte-Bibliothek, die Socket-Verbindungen und Verwendungen select() zu sehen öffnet, wenn Steckdosen bereit zum Lesen oder Schreiben sind. Zusätzlich wird die dritte Partei Bibliothek wurde mit __FD_SETSIZE Satz auf 1024 (Standardwert) zusammengestellt.

Wenn die Bibliothek eine Socket öffnet, wenn alle Datei-Deskriptoren unter 1024 im Einsatz sind, dann wird es einen Deskriptor erhalten, dass select() und zugehörigen FD_ * Makros nicht bewältigen können. Dies wird in Prozess abstürzt oder nicht definiertes Verhalten zur Folge hat.

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