Pregunta

Me trazó un proceso oráculo, y lo encuentro primero abrir un archivo como /etc/netconfig 11 identificador de archivo, y luego duplicarlo como 256 llamando fcntl con el parámetro F_DUPFD, y luego close la 11 mango archivo original. Más tarde se leyó usando 256 identificador de archivo. Entonces, ¿cuál es el punto de duplicar el identificador de archivo? ¿Por qué no sólo trabajar en el identificador de archivo original?

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
¿Fue útil?

Solución

Como acotación al margen, son archivo descriptores en lugar de archivo asas . Estos últimos son una característica C se utiliza con fopen y sus hermanos mientras descriptores son más UNIXy, para su uso con open et al.

Interesante. La única razón por la que viene a la mente es que alguna otra pieza de código tiene una necesidad específica para el descriptor de archivo a ser 256. sospecho solamente Oracle sabría las razones extrañas para eso. En cualquier caso, no está garantizado para obtener 256, se obtiene el archivo descriptor primer archivo disponible superior o igual a ese número.


A partir de un poco de investigación (no sé todos pequeña cosa sobre las entrañas de UNIX de la parte superior de la cabeza), no son atributos que pertenecen a un grupo de descriptores tales como duplicados posición de archivo y modo de acceso. Hay otros atributos que pertenecen a un solo descriptor de archivo, incluso cuando se duplica, como la bandera close-on-exec en GNULib.

Hacer un duplicado (ya sea con dup, dup2 o su fcntl) podría ser una manera de crear dos descriptores, uno con diferentes atributos de descriptor de archivo, pero no puedo ver que ser el caso en su pregunta desde el primer descriptor es de todos modos cerrado. Como usted dice, ¿por qué no utilizar el descriptor de baja?

Curiosamente, si google para netconfig f_dupfd, verá los rastros similares en los que falla la fcntl y continúa para leer ese archivo con la baja descriptor así que mis pensamientos sobre la materia son que se trata de un intento de preservar los descriptores de fichero bajas como tanto como sea posible. Por ejemplo:

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

Tal vez el software tiene una matriz de bytes de los descriptores de archivo en alguna parte que está limitado por lo que intenta mover otros archivos por encima del límite de 255.

Pero, en realidad, eso es sólo conjeturas de mi parte (aunque me gustaría pensar que es relativamente conjeturas inteligentes). También hay que tener en cuenta que puede que no sea de Oracle en sí haciendo esto. El material netconfig se utiliza en una gran cantidad de lugares por lo que puede haber alguna biblioteca subyacente de hacer eso, especialmente a la luz del hecho de que la mayor parte de las visitas en la Web antes mencionados no eran específicas de Oracle (ftp, remsh y así sucesivamente).

Otros consejos

En algunos sistemas, como Solaris, E / S estándar con el archivo sólo funciona con los descriptores de fichero 0-255 debido a que su implementación de la estructura de archivos utiliza un entero de 8 bits en lugar de int. Si un programa utiliza una gran cantidad de descriptores de archivos, es útil para los descriptores de archivos de reserva 3-255 usando fnctl (fd, F_DUPFD, 256). De lo contrario, funciona como fopen (), freopen () y fdopen () fallará si tiene 256 archivos abiertos.

Este es otro ejemplo cuando se necesita una técnica de reservar descriptores de archivo bajas con números.

Supongamos que un proceso abre un gran número de descriptor de archivo, por ejemplo, se acepta más de 1024 conexiones de socket simultáneas. Al mismo tiempo, el proceso también utiliza la biblioteca de terceros que abre conexiones de socket y usos select() para ver si tomas están listos para leer o escribir. Además, la biblioteca de terceros se compiló con el conjunto __FD_SETSIZE a 1024 (valor por defecto).

Si la biblioteca abre un socket cuando todos los descriptores de archivo por debajo de 1024 están en uso, entonces obtendrá un descriptor que select() y asociado FD_ * macros no pueden hacer frente. Esto dará lugar a estrellarse proceso o comportamiento indefinido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top