2011-11-09 7 views
5

Estoy escribiendo un programa usando epoll_wait para esperar los descriptores de archivos en Linux de 64 bits, y trato de poner algo de información junto con el descriptor de archivo en los datos del usuario epoll_event.¿Cuál es el rango de descriptores de archivos en Linux de 64 bits?

Sé en la práctica que es poco probable que el descriptor de archivo supere los 32 bits. Solo quiero saber que kernel garantiza que los descriptores de archivos tengan un rango específico, o solo cuenta desde pequeño y poco probable que sea muy grande.

+0

Imagino que los números FD se reciclarán, por ejemplo. nunca exceda la mayor cantidad de descriptores abiertos simultáneos para el proceso, pero ... No tengo ni idea. –

+0

fd es, por definición, una int "no pequeña" no negativa, cualquiera que sea "pequeña" significa en tiempo de ejecución. Más allá de eso, el kernel no garantiza su valor. –

Respuesta

9

La interfaz epoll_ctl(2) para agregar nuevos descriptores de archivo toma un argumento int fd, por lo que ya está limitado al rango de 32 bits (al menos en las plataformas Linux con las que estoy familiarizado).

Está limitado por /proc/sys/fs/file-max límite de todo el sistema en la cantidad de archivos abiertos para todos los procesos; /proc/sys/fs/file-max es actualmente 595956 en mi sistema.

Cada proceso está limitado por el límite de setrlimit(2)RLIMIT_NOFILE por proceso en la cantidad de archivos abiertos. 1024 es un límite común de RLIMIT_NOFILE. (Es muy fácil cambiar este límite a través de /etc/security/limits.conf.)

Es una aplicación poco común que necesita más de 1024. Los 32 bits completos parecen improbables también, ya que cada archivo abierto tomará algo de memoria del núcleo para representar: cuatro mil millones ~ 280 bytes struct inode estructuras (como mínimo) es un lote de memoria fija.

+0

Gracias, parece que puedo ahorrar algo de seguridad para su uso en ese momento. –

2

¿Planea tener 2 mil millones de descriptores de archivos abiertos, y espera que el sistema operativo maneje esto?

En la mayoría de los * * nix, las funciones que devuelven un FD lo devuelven como int, con < 0 como descriptor no válido. Esas funciones devuelven FD en un int, por lo que el rango de ese tipo es el rango para FD. (Menos los negativos (sin juego de palabras)) Yo seguiría: uso el mismo tipo, por lo tanto, int.

1

Encontré un comentario en el núcleo que indica que el límite superior duro es 1024 * 1024.

-1

el rango de descriptores de archivos en 64 bits (también se aplica al sistema de 32 bits) Linux es de 0 a 1023, no se puede crear más de 1023 abre el descriptor de archivo. Intenta abrir más que 1023 file-descriptor, entonces el sistema devolverá el error EBADF (Bad file descriptor), error no - 9.

Cuestiones relacionadas