open() console для файловых дескрипторов по умолчанию

open() console для файловых дескрипторов по умолчанию

Я читаю реализацию программы оболочки на языке C (оболочка xv6 из курса 6.828 «Инженерия операционных систем» Массачусетского технологического института).

Функция main()этой оболочки начинается со следующего кода:

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

Это цитата из книги xv6, которая объясняет приведенный выше код:

«Оболочка гарантирует, что у нее всегда открыты три файловых дескриптора, которые являются файловыми дескрипторами по умолчанию для консоли».


Я понимаю, что open()это вернет файловый дескриптор с наименьшим доступным номером, таким образом, этот код гарантирует, что открыто не более трех файловых дескрипторов, что довольно очевидно после прочтения объяснения автора.

Но вот что я не понимаю:

  1. Почему оболочка хочет закрыть все файловые дескрипторы, кроме 0, 1 и 2? В конце концов, гарантировано, что 0, 1 и 2 будут связаны с консолью, не так ли? Почему оболочка должна заботиться о том, чтобы закрывались файловые дескрипторы с большим номером?

  2. Наверное, я не совсем понимаю назначение файла console ( /dev/console ? ).

решение1

Этот фрагмент кода открывает /dev/console. Результирующий файловый дескриптор — это файловый дескриптор с наименьшим номером, который еще не открыт. Если это число не больше 2, цикл выполняется снова. Если это число равно 3 или больше, дескриптор закрывается и цикл останавливается.

Когда цикл завершается, файловые дескрипторы от 0 до 2 (stdin, stdout и stderr) гарантированно открыты. Либо они были открыты ранее и могут быть подключены к любому файлу, либо они были только что открыты и подключены к /dev/console.

Выбор /dev/consoleстранный. Я бы ожидал /dev/tty, что , который всегда является управляющим терминалом, связанным с группой процессов вызывающего процесса. Это один из немногих файлов, которыестандарт POSIX требует существования. /dev/consoleэтосистемная консоль, куда попадают сообщения syslog, отправляемые на консоль; оболочке нет смысла беспокоиться об этом.

решение2

Это интересно для цикла. 'open()' возвращает наименьшее количество файловых дескрипторов. Например, текущий fd равен 10, что иллюстрирует, что 0,1... и 9 были открыты ранее. Он закрывает один дополнительный файловый дескриптор для консоли, которую он только что открыл.

Связанный контент