Що в файлі?

Формат файлу визначається використовує його програмою тому, ймовірно, велика кількість типів файлів визначається різноманітністю програм Але, оскільки файлові типи в файлової системі не визначені, то і ядро ​​нічого про них не знає Команда file робить припущення про тип файлу (коротко пояснимо, як вона це робить):

$ file /bin /bin/ed /usr/src/cmd/edc  /usr/man/man1/ed1

/bin:      directory

/bin/ed:            pure  executable

/usr/src/cmd/edc:           c program  text

/usr/man/man1/ed1:        roff, nroff,  or  eqn input  text

$

Тут представлені чотири типових файлу, що відносяться до редакторові каталог, в якому вони розташовані (/ bin), власне двійковий виконуваний файл (/ bin / ed), файл з вихідним текстом на С (/ usr / src / cmd / edc) і сторінка керівництва (/ usr/man/man1/ed1)

Для визначення типу файлу команда file не використовує його імя (хоча це можливо), так як угоди про іменуванні – це всього лише угоди, і вони не дають стовідсоткової гарантії Наприклад, файли з розширенням c майже завжди містять вихідні тексти на Сі, але ніщо не заважає створити такий файл з довільним вмістом Замість цього file читає перші кілька сотень байт і шукає в них ключові послідовності символів (Як буде показано нижче, спеціальні системні файли, такі як каталоги, можуть бути визначені шляхом запиту до системи, але команда file може ідентифікувати каталог при його читанні)

Іноді ключі очевидні Виконується програма починається з «ма гического числа» в двійковому поданні Команда od без параметрів виводить дамп файлу 16-бітними порціями або 2-байтовими словами, дозволяючи побачити це чарівне число: 1

$ od /bin/ed

0000000 000410 025000 000462 011444 000000 000000  000000 000001

0000020 170011 016600 000002 005060 177776 010600  162706 000004

0000040 016616 000004 005720 010066 000002 005720  001376 020076

$

Вісімкове значення 410 означає звичайну виконувану програму, таку, яка дозволяє розділяти виконуваний код декільком процесам (Конкретні значення магічних чисел залежать від систе ми) Вісімкові значенням 410 не відповідає ніякої ASCII символ, тому воно не може бути випадково створено в такій програмі, як редактор Але, зрозуміло, ніщо не заважає створити такий файл за допомогою власної програми, і тоді система, відповідно до прийнятого угодою, буде вважати його виконуваною програмою

У текстових файлах ключі можуть зустрічатися серед іншого тексту, тому file визначає вихідні тексти на Сі по наявності таких слів, як # include, а вхідні дані програм nroff або troff – по наявності точки на початку рядка

Може виникнути питання, чому система не стежить за типами фай лов більш ретельно, щоб, наприклад, не допустити застосування команди sort до файлу / bin / ed Одна з причин – небажання забороняти деякі корисні дії Хоча команда

$ sort /bin/ed

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

1 У сучасних реалізаціях UNIX набули поширення більш совер шенние і складні формати довічних виконуваних файлів, але, тим не менш, find для їх визначення слід викладеним тут принципам – Прямуючи науч ред

користування Такі команди, як od, wc, cp, cmp, file і багато інших, працюють з файлами незалежно від їх вмісту Але ідея бесформатних файлів ще глибше Якщо б, наприклад, вхідні файли nroff відрізнялися за форматом від вихідних текстів на Сі, редактору довелося б вставляти ці відмінності при створенні файлу і обробляти їх при читанні і повторному редагуванні А це безперечно ускладнило б авторам створення прикладів на Сі в главах з 6 по 8

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

$ od -c  junk  &gttemp

$ ed ch21

1534

r  temp

168

Команда od виводить текст, який може бути прочитаний всюди, де тільки припустима робота з текстом Таке однаковість дещо незвично більшість систем навіть для тексту мають кілька разів особистих форматів і вимагають додаткових відомостей від програми або користувача для створення файлу певного типу У системах UNIX існують файли лише одного виду, і все, що потрібно для доступу до файлу – Це його імя1

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

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

1 Даг Мак-Ілрой (Doug McIlroy) запропонував хороший тест для перевірки однаковості файлової системи – UNIX пройшла його без проблем Чи може висновок програми, написаної на Фортране, бути використаний як вхід для компілятора Фортрана Переважна більшість систем зазнають труднощів при проходженні цього тесту

як у більшості з них зроблені неявні припущення про максимальну довжину текстового рядка (див, наприклад, розділ BUGS сторінки керівництва sort (1))

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

Джерело: Керниган Б, Пайк Р, 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>

*

*