[ Содержание ]
Как уже говорилось выше — в Linux все представлено в виде файлов. Но файлы бывают разных типов.
Тип файла можно узнать при помощи программы ls (первый символ первого поля) или при помощи программы stat.
В Linux используются файлы следующих типов:
- Обыкновенный файл — то, что принято считать файлом в Windows: текстовые файлы, файлы баз данных, исполняемые файлы программ и т.д. Программа ls обозначает их символом тире (–).
- Директория. Обозначаются символом d.
- Символьная ссылка. Обозначаются символом l.
- Файл блочного устройства. Обозначаются символом b.
- Файл символьного устройства. Обозначаются символом c.
- FIFO. Обозначаются символом f.
- Socket (соединение). Обозначаются символом s.
С обыкновенными файлами, директориями и символьными ссылками все более или менее ясно. Осталось понять, для чего предназначены другие типы файлов.
Начнём с файлов устройств. Первое, что надо запомнить: файл устройства — это не драйвер устройства. Это специальный механизм, при помощи которого программы могут общаться с драйверами устройств.
С файлами устройств можно работать при помощи стандартных функций open, read, write, close. Т.е. не требуется написания специальных механизмов доступа к драйверам устройств из программ. После того, как файл устройства будет открыт при помощи open, мы можем передавать информацию драйверу устройств записывая её в файл при помощи write. Для того что бы прочитать информацию, передаваемую нам драйвером устройства, достаточно воспользоваться функцией read для чтения из файла устройства. Как вы видите, с файлом устройством работают так же как и с обыкновенным файлом.
Кроме облегчения доступа к драйверам, файлы устройств используются для ограничения доступа к оборудованию. Например, если вы запретите пользователю доступ к файлу устройства, соответствующего DVD-ROM, вы запретите пользователю доступ к соответствующему устройству.
В Linux существуют два типа устройств: символьные и блочные. В символьных устройствах информация передается последовательно, по одному биту. Например, COM порт или консоль — это символьные устройства. В блочных устройствах информация передается параллельно. К таким устройствам относятся жесткие диски, CD-ROM и т.д. Все блочные устройства в системе для ускорения работы с ними буферизируются.
Файлы FIFO (иногда их ещё называют именованными каналами) предназначены для передачи данных между программами. Представьте, что одной программе необходимо передать другой программе большое количество данных. В Linux программы не имеют доступ к оперативной памяти другой программы и не могут передать данные непосредственно в память. Но одна программа может открыть FIFO файл на запись, а другая открыть его на чтение. FIFO — это first input first output, первый вошел, первый вышел. То есть данные передаются как по трубе.
Внимание! Если вы думаете, что передача данных через файловую систему — это медленная операция, то тут вы немного ошибаетесь. В Linux все файловые системы буферизируются. Реально передача данных между программами происходит через буфера файловой системы, то есть через оперативную память.
У FIFO файлов много достоинств, но есть один серьезный недостаток: данные можно передавать только в одну сторону. Если программам необходимо организовать двухстороннюю передачу данных, то лучше воспользоваться сетевым соединением. Но использовать реальное сетевое соединение имеет смысл только тогда, когда программы выполняются на разных компьютерах в сети. Если они работают на одном и том же компьютере, то лучше передавать данные через специальные файлы, так называемые UNIX domain sockets. При использовании файлов типа socket, как и в случае использования FIFO файлов, данные передаются через буфера файловой системы но в обеих направлениях.
Файлы типа socket в Linux применяются повсеместно. Например, графическая оболочка X Window построена по принципу клиент-сервер. Когда программы X сервер и Х клиенты работают на одной машине, они общаются через файлы типа socket. Множество этих файлов можно увидеть в директории /tmp. Или взаимодействие почтового сервера и антивируса. Антивирус ClamAV может принимать запросы как по реальному сетевому соединению, так и через файл типа socket. Но при настройке почтового сервера приходится явно указывать каким из способов передачи данных необходимо пользоваться.
[ Содержание ]