Файлова система Основи

Все, що тільки є в системі UNIX, – це файл І це не таке вже через мірне спрощення, як може здатися на перший погляд Коли розроблялася перша версія системи, ще до того, як вона отримала назва, було вирішено сконцентрувати зусилля на створенні простий і зручною у використанні структури файлової системи І своєму успіху і зручності застосування UNIX у великій мірі зобовязаний саме файлової системи Вона являє собою один з кращих прикладів втілення філософії «простоти», показуючи, який мощі можна досягти акуратною реалізацією невеликої кількості добре продуманих ідей

Щоб впевнено почувати себе при вивченні команд і їх взаємозвязків, необхідно мати уявлення про основи структури та функціонування файлової системи У цій главі обговорюється більшість аспектів використання файлової системи: що таке файли, ніж вони представлені, каталоги та ієрархія файлової системи, права доступу, індексні дескриптори (внутрішня системна запис файлів, inodes) і файли пристроїв Так як практично завжди використання системи UNIX повязано з обробкою файлів, існує безліч команд для отримання інформації про файлах і їх трансформації найуживаніші з них представлені в цьому розділі

Файл – це послідовність байтів (Байт – це невеликий фрагмент інформації, що складається з 8 біт У цій книзі під байтом ми будемо розуміти еквівалент символу) Система не навязує файлу якусь певну структуру і жодним чином не намагається трактувати його

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

Кращий спосіб вивчення файлів – практика, так що давайте почнемо з створення невеликого файлу:

$ ed a

now is  the  time

for  all  good  people

.

w  junk

36

q

$ ls -l junk

–rw–r––r–– 1 you                   36  Sep 27 06:11  junk

$

Створено файл junk, в ньому 36 байт – 36 символів, які були введені з клавіатури в режимі додавання (природно, не рахуючи виправлень помилок введення) Щоб переглянути файл, введіть

$ cat  junk

now  is  the  time

for  all  good  people

$

Команда cat показує, як виглядає файл Команда od (octal dump – восьмеричний дамп) виводить видиме представлення всіх байтів файлу:

$ od -c  junk

0000000    n     o     w                    i   s             t   h      e             t   i   m         e   \n 0000020    f   o     r             a      l   l       g     o     o     d             p     e      o 0000040    p     l   e   \n

0000044

$

Параметр-c означає «інтерпретувати байти як символи» Якщо заданий параметр-b, то буде показано і восьмеричне уявлення байтів: 1

1 Кожен байт файлу – це число, досить велика для кодування друкованих символів У більшості UNIX-систем прийнята кодування ASCII, деякі ж машини, зокрема випущені IBM, користуються кодуванням EBCDIC У цій книзі всюди мається на увазі кодування ASCII введіть cat / usr / pub / ascii або зверніться до ascii (7), щоб переглянути восьмеричні значення всіх символів

$ od -cb  junk

0000000    n     o     w                    i   s             t   h      e             t   i   m         e   \n 156 157 167  040 151 163 040 164 150 145 040 164  151  155 145 012

0000020    f   o     r         a     l   l       g     o     o      d             p     e     o

146 157 162 040 141 154 154 040 147  157  157 144 040 160 145 157 0000040    p     l      e      \n

160 154 145   012

0000044

$

Семизначні числа зліва позначають місце розташування у файлі – порядковий номер наступного виведеного символу, у вісімковій запису Між іншим, те, що восьмеричним числах надано таке значення, – Це спадщина PDP-11, для якої кращою була восьмерична нотація Для інших машин більше підходить шестнадцатеричная запис – параметр-x дозволяє виводити в такому вигляді

Зверніть увагу, що після кожного рядка зустрічається символ з вісімковим значенням 012 Це ASCII-символ нового рядка, Тобто те, що система поміщає в потік введення, коли користувач натискає клавішу Return За угодою, запозиченого з Сі, представлення символу нового рядка виглядає як \ n, але це просто умовність, використовувана такими програмами, як od, для зручності читання, насправді ж величина, збережена у файлі, – це один байт 012

Символ нового рядка – це найбільш часто вживаєтьсяспеціаль5 ний символ Інші символи, зіставлені деякими операціями управління терміналом, включають в себе повернення на одну позицію (вісімкове значення 010, виводиться як \ b), табуляцію (011, \ t) і повернення каретки (015, \r)

Дуже важливо розрізняти значення, яке зберігається для символу у файлі, і те, як він інтерпретується в різних ситуаціях Наприклад, ко ли з клавіатури вводиться повернення на одну позицію (Backspace), Якщо цей символ в конкретній системі служить для видалення, ядро ​​інтерпретує його як відмова від попереднього введеного символу У результаті і символ повернення, і символ, що стояв перед ним, зникають, але введе ня повернення на одну позицію відбивається на терміналі, курсор переміщається на одну позицію назад

Якщо ж ввести послідовність

(Тобто спочатку \, а потім символ повернення на одну позицію), то ядро ​​інтерпретує це не як введення спеціального символу повернення, а як бажання помістити символ повернення в потік введення, тому символ \ Відкидається, а байт 010 міститься у файл При відображенні символу повернення на терміналі курсор переміщається на місце символу \

Прививеденніфайлу, що містить символ повернення, останній не інтерпретується терміналом, а викликає переміщення курсору назад

Якщо файл виведений командою od, символ повернення представлений значенням 010 або \ b, якщо вказано параметр-c

Це ж відноситься і до табуляції: при введенні символ табуляції отобра жается на терміналі і пересилається програмі, яка виконує читання, при виведенні він відправляється на термінал і там інтерпретується Але є і відмінність –ядроможе бути налаштоване таким чином, що буде заміняти при виведенні символи табуляції відповідною кількістю пробілів Символ табуляції встановлює курсор в позиціях 9, 17, 25 і т д Команда

$ stty -tabs

викликає заміну символів табуляції пробілами при виведенні на тер5 міна (stty(1))

Аналогічно обробляється і Return Ядро відображає на терміналі натискання клавіші Return як символ повернення каретки і роздільник рядків, а в файл відправляє тільки символ нового рядка При виведенні перед символом нового рядка додається повернення каретки

Підхід, реалізований у системі UNIX для подання керуючої інформації, що не традиційний, зокрема в тому, що стосується використання символів нового рядка в кінці рядків Натомість у багатьох системах існують «записи», по одній на рядок, кожна з яких містить не тільки введені дані, а й підрахована кількість символів у рядку (і ніяких роздільників рядків) Інші системи закінчують рядок символами повернення каретки інового рядка, тому що саме така послідовність вимагається для виведення на більшості терміналів (Поняття «перехід на інший рядок» (linefeed) позначає те ж саме, що і роздільник рядків, тому послідовність, згадану вище, часто називають «CRLF» (carriage return line feed), що зручніше для вимови)

Система UNIX не чинить ні того, ні іншого – немає ні записів, ні підрахунку символів, і файл не містить байти, які користувач або його програми не поміщали в нього При виведенні на термінал роздільник рядків доповнюється поверненням каретки, але програмам досить обробляти тільки символ нового рядка, т к вони знають тільки про нього У більшості випадків потрібно саме таку поведінку При необхідності на основі такої простої схеми можна побудувати і складнішу Зворотного, тобто створення простої схеми на базі більш складною, досягти важко

Оскільки кінець кожного рядка відзначений символом нового рядка, можна було б очікувати, що і файли повинні закінчуватися какимлибо спеціальним символом, скажімо \ e (від англ End – кінець) Але, вивчаючи висновок команди od, ви не знайдете символу кінця файлу, він просто закінчується Замість використання спеціального коду система підписує кінець файлу, просто повідомляючи, що даних більше

немає Ядро зберігає відомості про довжини файлів, тому програма виявляє кінець файлу, коли обробить його останній байт

Програма отримує дані файлу, використовуючи системний виклик (підпрограму ядра) read При кожному виклику read повертає чергову порцію даних – наступний рядок тексту, що вводиться з терміналу, наприклад Крім того, вона повідомляє, скільки байтів файлу було отримано, так що, отримавши від read повідомлення «отримано нуль байтів», можна вважати, що досягнуто кінець файлу Якщо ж будь байти ще залишилися, read поверне частину з них Дійсно, немає сенсу вводити спеціальний символ кінця файлу, тому що, як було вже сказано, сенс байта залежить від способу його інтерпретації Проте, всіфайли повинні де-небудь кінчатися, а так як всі вони повинні бути доступні для читання функцією read, то повернення нуля являє собою незалежний від інтерпретації спосіб вказівки кінця файлу без використання додаткових символів

Коли програма читає дані з терміналу, ядро ​​передає їй кожну вводимую рядок тільки після введення символу нового рядка (тобто при натисканні Return) Тому, поки символ нового рядка не введений, є можливість повернутися і виправити помічену друкарську помилку Якщо ж помилку виявлено після натискання клавіші Return, То виправляти її пізно, так як рядок вже прочитана програмою

За допомогою команди cat можна спостерігати, як працює такий порядковий введення Зазвичай ця команда для підвищення ефективності буферизует висновок для підвищення продуктивності, щоб виконувати запис великими блоками, але параметр-u дозволяє відключити буферизацію запису, і тоді прочитання рядка негайно відправляються на висновок:

$ cat Висновок з буферизацією

123

456

789 ctld 123 456 789

$ cat-u Висновок без буферизації

123

123

456

456

789

789

ctld

$

При натисканні клавіші Return cat отримує чергову рядок при відключеною буферизації отримані дані виводяться відразу

Тепер спробуємо інакше: введемо декілька символів, а замістьReturn

натиснемо ctl5d:

$ cat  -u 123ctld123

Символи виводяться відразу після натискання комбінації ctl5d, яка означає «негайно відправити надруковані символи програмі, яка виконує читання даних з терміналу» На відміну від символу нового рядка, ctl5d не передається в програму Тепер, не вводячи нічого більше, натиснемо ctl5d двічі:

$ cat  -u 123ctld123ctld$

Оболонка виводить запрошення на введення, оскільки команда cat, не отримавши символів, вважає, що досягнуто кінець файлу, і завершується По натискання ctl5d все, що було введено на терміналі, відправляється програмі, яка виконує читання з термінала Якщо нічого не введено, то програма, не отримавши чергової порції символів, сприйме це як кінець файлу Саме тому натискання ctl5d завершує сеанс – оболонка вважає, що введення закінчено Звичайно, символ ctl5d зазвичай служить для сповіщення про закінчення файлу, але цікаво і його більш загальне призначення

Вправа 21Що відбудеться при натисканні ctl5d в редакторі ed

Порівняйте з командою

$ ed &ltfile

~

Джерело: Керниган Б, Пайк Р, UNIX Програмне оточення – Пер з англ – СПб: Символ-Плюс, 2003 – 416 с, Мул

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*