дескриптор файлу проти імені файлу


12

Мені було цікаво, які відмінності та співвідношення між дескрипторами файлів та іменами файлів. Чи всі вони використовуються для доступу до файлів? Якщо так, таким же чином?

Так , наприклад, /dev/fd/0, /dev/stdinі /proc/self/fd/0всі посилання на /dev/pts/2. Це чотири дескриптори файлів чи назви файлів?


Відповіді:


12

Всі четверо /dev/fd/0, /dev/stdin, /proc/self/fd/0і /dev/pts/2імена файлів, так само як /////dev/../dev/fd//0, /bin/sh, /etc/fstab, /fioejfoeijfі т.д. Все , але це останній приклад, швидше за все, ім'я існуючого файлу на вашому комп'ютері. Ім'я файлу - це рядок, який може позначати файл у вашій файловій системі; під Linux, будь-яка рядок, що не містить нульового байта і має довжину не більше 4096 байт, є дійсним ім'ям файлу. Багато з цих імен еквівалентні, наприклад , /bin/shеквівалентні ///bin/sh, /bin/../bin/sh(припускаючи , що /binце існуючий каталог) і т.д. Всі ці приклади я дав до сих пір абсолютні імена файлів; Є також відносні імена файлів, які не починаються з а /і значення яких залежать від поточного каталогу.

Термінологія навколо імен файлів не є універсальною; іноді "ім'я файлу" означає повний шлях до файлу, а іноді означає ім'я запису каталогу. Термінологія POSIX - це " ім'я файлу " або " компонент імені шляху " для імені запису каталогу та " ім'я шляху " для повного шляху.

Дескриптор файлу позначає відкритий файл у певному процесі. Ядро підтримує таблицю дескрипторів файлів для кожного процесу. Кожен запис у таблиці дескрипторів файлів вказує, що робити, якщо процес вимагає читання, запису та інших операцій над дескриптором файлів.

Дескриптори файлів можуть відповідати файлу і мати пов’язане ім'я, але не всі вони. Для тих, хто це робить, цей файл може бути звичайним файлом, каталогом, файлом пристрою або названою трубкою (також називається FIFO) (вид, створений компанією mkfifo); деякі системи мають інші можливості, такі як розетки та двері Unix. Приклади дескрипторів файлів, які не мають асоційованого іменованого файлу, включають труби (вид, створений самим pipe) та мережеві сокети .

/dev/fd/0, /dev/stdinі /proc/self/fd/0є назви файлів (усі еквівалентні) з особливим значенням: всі вони позначають те, до якого файлу в даний час можна отримати доступ через дескриптор файлу 0. Коли процес відкриває їх, ядро ​​копіює запис з індексом 0 у таблицю дескрипторів файлу дескриптора до нової дескриптор. Відкриття будь-якого з цих файлів рівнозначно дзвінкам dup(0). Названі файли - це спосіб опосередковано отримати процес використання одного з уже відкритих файлів, а не відкриття нового файлу; вони в основному корисні для передачі в командному рядку програми, де програма очікує відкриття імені файлу.


@Giles Ви написали "Кожен запис у таблиці дескрипторів файлів вказує, що робити, якщо процес вимагає читання, запису та інших операцій над дескриптором файлу." ( Акцент мій). Наскільки я зрозумів, це просто ціле число, як стандартне 0,1,2 і т.д. для stdin, stdout і stderr відповідно. Це були б більш високі значення для звичайних файлів. Що я не отримую з вашого коментаря, це те, як це число вказує "що робити, якщо процес вимагає читання, запису та інших операцій на дескрипторі файлу". . Чи можете ви трохи розширити це?
Geek

@Geek Запис у таблиці дескрипторів файлів - це не число. Число - це індекс цієї таблиці.
Жил 'ТАК - перестань бути злим'

@Giles дякую за роз’яснення мого непорозуміння. Я зараз це краще розумію. Тож чи можете ви надати приклад прикладу "що робити" у вашій відповіді. Я зрозумів, що кожен запис у таблиці дескрипторів файлів знову містить вказівник на таблицю файлів, яка містить інформацію, як зрушення файлу, стан файлу тощо. Але мені все ще не зрозуміло, що стосується "що робити" у вашій відповіді.
Geek

2

Ім'я файлу - це лише назва файлу у файловій системі, нічого більше - це лише рядок.

Дескриптор файлу - це якийсь об’єкт, з якого можна читати та / або писати. Це відкритий і готовий файл. Існують не лише дескриптори файлів - stdin, stdout та stderr - це також дескриптори, ви можете писати та читати з них, використовуючи абсолютно ті самі функції, що й у файлах (за винятком випадків, коли ви не можете їх шукати). Іншими прикладами дескрипторів, які не є файлами, є: названі труби та мережеві розетки.

У коді дескриптор файлу - це змінна, що вказує на щось у ядрі, що представляє файл-об'єкт.

Наприклад, / dev / fd / 0, / dev / stdin, / proc / self / fd / 0 - всі посилання на / dev / pts / 2. Це чотири дескриптори файлів чи назви файлів?

Це все псевдофайли, які можуть бути корисні для деяких сценаріїв або програм. Ви можете їх відкрити, і відкриття () поверне вам дескриптор файлів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.