Question

Je trace un processus d'oracle, et trouvent d'abord ouvrir un /etc/netconfig de fichier en tant que 11 poignée de fichier, puis dupliquer comme 256 en appelant fcntl avec le paramètre F_DUPFD et close alors la 11 poignée de fichier d'origine. Plus tard, il lu en utilisant 256 poignée de fichier. Alors, quel est le point de dupliquer le descripteur de fichier? Pourquoi ne pas simplement le travail sur la poignée du fichier d'origine?

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
Était-ce utile?

La solution

En aparté, ils sont fichier descripteurs plutôt que fichier poignées . Ces derniers sont une caractéristique de C est utilisé avec fopen et ses frères tandis que les descripteurs sont plus unixy, pour une utilisation avec open et al.

Intéressant. La seule raison qui vient à l'esprit est qu'un autre morceau de code a un besoin spécifique pour le descripteur de fichier à 256. Je ne suspectent Oracle connaîtrait les raisons bizarres pour cela. Dans tous les cas, vous n'êtes pas assuré d'obtenir 256, vous obtenez le premier fichier descripteur de fichier disponible supérieur ou égal à ce nombre.


D'un peu d'investigation (je ne sais pas tous petite chose sur les entrailles d'UNIX du haut de ma tête), il y a des attributs qui appartiennent à un groupe de descripteurs dupliqués tels que position de fichier et le mode d'accès. Il existe d'autres attributs qui appartiennent à une à descripteur de fichier, même lors de la duplication, tels que le drapeau close-on-exec dans gnulib.

Faire un double (soit avec dup, dup2 ou votre fcntl) pourrait être un moyen de créer deux descripteurs, une avec différents attributs de descripteur de fichier, mais je ne vois pas que d'être le cas dans votre question depuis le premier descripteur fermé de toute façon. Comme vous le dites, pourquoi ne pas simplement utiliser le descripteur bas?

Il est intéressant, si vous Google pour netconfig f_dupfd, vous verrez des traces similaires où l'fcntl échoue et il continue de lire ce fichier avec le descripteur bas pour mes réflexions sur la question sont que ce soit une tentative de préserver les descripteurs bas de fichiers comme autant que possible. Par exemple:

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

Peut-être que le logiciel a un tableau d'octets de descripteurs de fichiers quelque part que ce limité, il tente de déplacer d'autres fichiers au-dessus du 255 limite.

Mais vraiment, c'est devinettes juste de ma part (bien que je me plais à penser qu'il est relativement intelligente devinettes). Gardez à l'esprit qu'il ne peut pas être lui-même Oracle faire. Le truc netconfig est utilisé dans beaucoup d'endroits il peut être une bibliothèque sous-jacente fait que, compte tenu notamment du fait que la plupart des mentionnés ci-dessus hits web n'étaient pas spécifiques à Oracle (ftp, remsh et ainsi de suite).

Autres conseils

Sur certains systèmes, comme Solaris, E / S standard avec FILE fonctionne uniquement avec les descripteurs de fichiers 0-255 parce que sa mise en œuvre de la structure de fichier utilise un entier 8 bits au lieu de int. Si un programme utilise un grand nombre de descripteurs de fichiers, il est utile de descripteurs de fichiers de réserve 3-255 en utilisant fnctl (fd, F_DUPFD, 256). Dans le cas contraire, des fonctions comme fopen (), freopen () et fdopen () échouera si vous avez 256 fichiers ouverts.

Voici un autre exemple lorsqu'une technique de réserver des descripteurs de fichiers numérotés bas est nécessaire.

Supposons qu'un processus ouvre un grand nombre de descripteur de fichier, par exemple il accepte plus de 1024 connexions socket simultanées. En même temps, le processus utilise également la bibliothèque tierce partie qui ouvre des connexions socket et utilisations select() pour voir si les prises sont prêts pour la lecture ou l'écriture. De plus, la bibliothèque tierce partie a été compilé avec jeu de __FD_SETSIZE à 1024 (valeur par défaut).

Si la bibliothèque ouvre un socket lorsque tous les descripteurs de fichiers ci-dessous 1024 sont en cours d'utilisation, alors il obtiendra un descripteur qui select() et FD_ * macros associées ne peuvent pas faire face. Cela se traduira par processus ou plantage comportement non défini.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top