consola open() para descriptores de archivos predeterminados

consola open() para descriptores de archivos predeterminados

Estoy leyendo la implementación de un programa de shell en C (el shell xv6 del curso de ingeniería de sistemas operativos 6.828 del MIT).

La main()función de este Shell comienza con el siguiente código:

//Assumes three file descriptors open
while((fd = open("console", O_RDWR)) >= 0){
    if(fd >= 3){
        close(fd)
        break;
    }
}

Esta es una cita del libro xv6 que explica el código anterior:

"El shell garantiza que siempre tenga tres descriptores de archivos abiertos, que son los descriptores de archivos predeterminados para la consola".


Entiendo que open()devolverá un descriptor de archivo con el número más bajo disponible, por lo que este código garantiza que no haya más de tres descriptores de archivo abiertos, lo cual es bastante obvio después de leer la explicación del autor.

Pero la parte que no entiendo es:

  1. ¿Por qué el shell quiere cerrar todos los descriptores de archivos excepto 0, 1 y 2? Después de todo, está garantizado que 0, 1 y 2 estarán asociados con la consola, ¿no? ¿Por qué debería importarle al shell que se cierren descriptores de archivos con un número mayor?

  2. Supongo que realmente no entiendo el propósito del archivo de consola ( /dev/console ? ) aquí.

Respuesta1

Se abre este fragmento de código /dev/console. El descriptor de archivo resultante es el descriptor de archivo con el número más bajo que aún no está abierto. Si ese número es como máximo 2, el bucle se ejecuta nuevamente. Si ese número es 3 o superior, el descriptor se cierra y el ciclo se detiene.

Cuando finaliza el ciclo, los descriptores de archivo 0 a 2 (entrada estándar, salida estándar y stderr) están garantizados para estar abiertos. O estaban abiertos antes y pueden estar conectados a cualquier archivo, o acaban de abrirse y están conectados a /dev/console.

La elección /dev/consolees extraña. Habría esperado /dev/tty, que siempre es el terminal de control asociado con el grupo de procesos del proceso que llama. Este es uno de los pocos archivos queel estándar POSIX requiere existir. /dev/consolees elconsola del sistema, que es donde van los mensajes syslog enviados a la consola; No es útil que un shell se preocupe por esto.

Respuesta2

Es interesante para el bucle. 'open()' devuelve el número más bajo de descriptores de archivo. Por ejemplo, el fd actual es 10 que ilustra 0,1... y 9 estaban abiertos antes. Está cerrando un único descriptor de archivo adicional en la consola que acaba de abrir.

información relacionada