Окрім відповідей @ RuiFRibeiro та @ BruceEdiger, відмінність, яку ви робите, - це не саме відмінність ядра. Насправді у вас є різні види файлів: звичайні файли, каталоги, символічні посилання, пристрої, сокети (і я завжди забуваю їх декілька, тому я не намагаюся скласти повний список). Ви можете мати інформацію про тип файлу за допомогою ls
: це перший символ у рядку. Наприклад:
$ls -la /dev/sda
brw-rw---- 1 root disk 8, 0 17 nov. 08:29 /dev/sda
Значення "b" на самому початку сигналізує про те, що цей файл є блоковим пристроєм. Тире, означає звичайний файл, "я" символічне посилання тощо. Ця інформація зберігається у метаданих файлу і є доступною, наприклад, через системний виклик stat
, тому ядро може читати файл по-різному, наприклад, символічне посилання.
Потім ви робите інше розмежування між такими як "реальні файли", як /bin/bash
"віртуальні файли", /proc/cpuinfo
але ls
повідомляєте як про звичайні файли, так що різниця має інший вид:
ls -la /proc/cpuinfo /bin/bash
-rwxr-xr-x 1 root root 829792 24 août 10:58 /bin/bash
-r--r--r-- 1 root wheel 0 20 nov. 16:50 /proc/cpuinfo
Що відбувається, це те, що вони належать до різних файлових систем. /proc
є точкою монтажу псевдофайлової системи, procfs
тоді як /bin/bash
знаходиться у звичайній файловій системі диска. Коли Linux відкриває файл (він робить це по-різному залежно від файлової системи), він заповнює структуру даних, file
яка, серед інших атрибутів, має структуру з декількох функціональних покажчиків, які описують, як користуватися цим файлом. Отже, він може реалізувати різну поведінку для файлів різного типу.
Наприклад, такі операції рекламуються /proc/meminfo
:
static int meminfo_proc_open(struct inode *inode, struct file *file)
{
return single_open(file, meminfo_proc_show, NULL);
}
static const struct file_operations meminfo_proc_fops = {
.open = meminfo_proc_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};
Якщо ви подивитесь на визначення meminfo_proc_open
, ви можете побачити, що ця функція заповнює буфер в пам'яті з інформацією, поверненою функцією meminfo_proc_show
, завданням якої є збір даних про використання пам'яті. Потім цю інформацію можна прочитати нормально. Кожен раз, коли ви відкриваєте файл, meminfo_proc_open
викликається функція , і інформація про пам'ять оновлюється.