Pregunta

Cuando se crean sockets o se abren/crean archivos en C, ¿se garantiza que el descriptor de archivo asignado al socket/archivo sea el descriptor de menor valor disponible?¿Qué dice la especificación C sobre la asignación de descriptores de archivos a este respecto, en todo caso?

¿Fue útil?

Solución

No se garantiza que sea el más bajo y depende de la implementación. (1).Sin embargo, en general, la rutina que asigna descriptores de archivos abiertos utiliza un método que le proporciona la primera apertura.Podría ser que inmediatamente después se liberen varios inferiores, dejándote con un descriptor más alto de lo que cabría esperar.

Sin embargo, la única razón que se me ocurre para saber esto es por la función de selección, que se acelera si le pasa el descriptor de archivo más alto que necesita verificar.

(1) Tenga en cuenta que aquellas implementaciones que siguen el estándar IEEE garantizan el descriptor más bajo no utilizado para archivos, pero es posible que esto no se aplique a los sockets.No todas las implementaciones siguen el estándar IEEE para open(), por lo que si estás escribiendo software portátil es mejor no depender de él.

Otros consejos

No creo que lo encuentre en la especificación C, más probablemente en la especificación de su sistema operativo.Mi experiencia en Linux ha sido que siempre es el más bajo.

Responderé a esto con otra pregunta: ¿por qué es importante?No debería comparar el descriptor del archivo con nada (a menos que verifique stdin/stdout/stderr) ni hacer cálculos con él.Siempre que quepa en un int (y está garantizado que lo hará), eso es todo lo que realmente necesitas saber.

Steve M tiene razón;C no tiene noción de sockets y sus funciones de E/S de archivos utilizan un [puntero a] objeto ARCHIVO, no un descriptor.

@aib open(), close(), lseek(), read(), write() hacen uso de descriptores de archivos.Casi nunca uso transmisiones para E/S.

@Kyle, es importante debido a declaraciones como select().Conocer el descriptor más alto puede mejorar el rendimiento.

La especificación C dice que depende de la implementación.Si está buscando una implementación de Unix, la página de manual de open(2) dice "El descriptor de archivo devuelto por una llamada exitosa será el descriptor de archivo con el número más bajo que no esté abierto actualmente para el proceso".

Esto ayuda si intentas adjuntar un archivo específico a un descriptor específico.Supongamos que desea redirigir stderr a /dev/null.Algo como

cerrar(2);open("/dev/null", O_WRONLY);

debería hacerlo.Por supuesto, debes capturar el fd devuelto por open y asegurarte de que sea 2.

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