| Создание файла: creat() |
|
Прежде чем мы перейдем к детальному рассмотрению механизмов низкоуровневого ввода-вывода в Linux, определим понятие режима файла. К каждому файлу в Linux привязана цепочка из 16 битов, которые можно условно разделить на три группы:
Эта цепочка называется режимом файла (file mode). Довольно часто режим файла отождествляют с правами доступа (permissions). Это не является грубой ошибкой, но и не совсем верно. Обратите внимание на 3-ю группу. Здесь тип файла определяет не характер содержащейся в нем информации (текст, изображение, музыка и т. д.), а особенности низкоуровневого ввода-вывода. По этому критерию ядро разделяет все файлы на следующие типы:
Linux — многопользовательская операционная система. Чтобы разграничить полномочия пользователей в отношении файлов, в ядре реализована концепция прав доступа, согласно которой каждый файл имеет владелы{а (user, owner) и группу (group). Владелец у файла всегда один, а в группе может состоять несколько пользователей. Кроме того, выделяют также понятие другой пользователь (other), т. е. тот, кто не обладает правами суперпользователя (root), не является владельцем и не состоит в указанной группе. Для каждой из перечисленных категорий (владелец, группа, другие) устанавливаются индивидуальные права доступа исходя из трех перечисленных далее критериев. 1. Право на чтение (read) — дает пользователю возможность читать данные из файла. Если файл является каталогом, то право на чтение интерпретируется как возможность просматривать его содержимое. 2. Право на запись (write) — предоставляет пользователю возможность записывать данные в файл. Если же файл является каталогом, то право на запись интерпретируется как возможность создавать, удалять и переименовывать файлы, находящиеся в этом каталоге. 3. Право на выполнение (execute) — дает пользователю возможность запускать файл. Если файл является каталогом, то право на выполнение разрешает пользователю "заходить" в этот каталог, т. е. делать его текущим (current).
Понятие "текущий каталог" реализовано не в оболочке, а в ядре Linux. Биты из диапазона от 0 до 8 режима файла описывают перечисленные права доступа для владельца, группы и остальных пользователей. Для указания прав доступа программисты могут использовать специальные именованные константы режима, соединяя их операцией побитовой дизъюнкции (ИЛИ). Чтобы получить доступ к константам режима, необходимо включить в программу заголовочный файл sys/stat.h. Рассмотрим теперь, что означает каждый бит базовых прав доступа и какая константа предназначена для его установки. Таблица. Назначение битов прав доступа и соответствующие им константы
Указать режим файла можно с помощью типа mode_t, который представляет собой целое число, размерность которого зависит от реализации. Для этого в программу необходимо включить заголовочный файл sys/types.h. В ранних Unix-подобных системах вместо mode_t использовался тип int. Предположим, что в программе нужно выставить права "чтение и запись для владельца", а также "чтение для группы". Это делается так: S_IRUSR | S_IWUSR | S_IRGRP Теперь рассмотрим системный вызов creat (), который создает и открывает файл с указанным режимом, возвращая файловый дескриптор. Прототип функции creat () объявлен в заголовочном файле fcntl.h следующим образом: int creat (const char * FILENAME, mode_t MODE); Первый аргумент (filename) — это имя файла. Второй аргумент (mode) — режим файла. Следует отметить, что в таблице дескрипторов не может быть отрицательных значений. Если системный вызов creat () вернул -1, это символизирует о том, что файл не удалось создать и открыть.
Теперь напишем программу, которая создает файл с указанным именем и правами на чтение для владельца. Программа creatl.с #include <stdio.h> В программе сначала создается переменная целого типа, в которую системный вызов creato при удачном завершении поместит дескриптор файла. В переменную fmode заносится единственная константа s_irusr, устанавливающая в единицу 8-й бит режима файла (чтение для владельца). Затем следует вызов creato, который в случае неудачи возвращает -1. Нетрудно догадаться, что он закрывает файл. Приведенная программа довольно проста, но самое интересное еще впереди. При первом запуске все идет "по плану": $ gcc -о creatl creatl.c Действительно, был создан файл нулевой длины с требуемыми правами доступа. Но если запустить программу creatl еще раз с тем же аргументом, получится сюрприз: $ ./creatl myfile И дело не в том, что файл уже существует, а в том, что права доступа выставлены только на чтение. Если файл существует, creat() очищает его, не меняя текущих прав доступа. Но поскольку при первом вызове программы файл был создан с правами доступа "только для чтения", то вызов creat() не смог очистить его (даже если нечего было чистить) и завершился неудачей. Эту ситуацию легко исправить: $ chmod u+w myfile $ Is -1 myfile Обратите внимание, что права доступа у файла не изменились, как и ожидалось. Можно также проверить и тезис о том, что creat () очищает существующие файлы: $ echo hello > myfile
Related Articles
Set as favorite
Bookmark
Email This
Hits: 196 Комментарии (0)RSS feed CommentsНаписать комментарий |