Фраза « Все есть файл » определяет архитектуру операционной системы. Это означает, что все в системе - от процессов, файлов, каталогов, сокетов, каналов и т. Д. - представлено файловым дескриптором, абстрагированным на уровне виртуальной файловой системы в ядре. Виртуальная файловая система - это интерфейс, предоставляемый ядром. Поэтому фраза была исправлена на " Все является файловым дескриптором ". Сам Линус Торвальдс еще раз поправил его немного точнее: « Все является потоком байтов ».
Однако у каждого «файла» также есть владелец и разрешения, о которых вы можете узнать из обычных файлов и каталогов. Поэтому классические инструменты Unix, такие как cat, ls, ps, ... могут запрашивать все эти «файлы», и нет необходимости изобретать другие специальные механизмы, кроме простых старых инструментов, которые все используют read ()
системный вызов. Например, в семействе ОС Microsoft есть несколько различных системных вызовов read ()
(я слышал около 15) для любых типов файлов, и каждый из них немного отличается. Когда все в виде файла, это вам не нужно.
На ваш вопрос : Конечно, существуют разные типы файлов . В Linux существует 7 типов файлов . Каталог - один из них. Но утилиты могут отличить их друг от друга. Например, полная функция команды cd
(при нажатии TAB ) перечисляет только каталоги, поскольку системный вызов stat ()
(см. man 2 stat
) возвращает структуру с полем с именем st_mode
. Стандарт POSIX определяет, что может содержать это поле:
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)
Функция завершения команды cd
просто отображает «файлы», в которых установлен флаг S_ISDIR
.