Skip to content

Home Программирование Создание файла: creat()
Создание файла: creat()

Прежде чем мы перейдем к детальному рассмотрению механизмов низкоуровневого ввода-вывода в Linux, определим понятие режима файла. К каждому файлу в Linux привязана цепочка из 16 битов, которые можно условно разделить на три группы:

  1. Биты 0—8: базовые права доступа.
  2. Биты 9—11: расширенные права доступа.
  3. Биты 12—15: тип файла.

Эта цепочка называется режимом файла (file mode). Довольно часто режим файла отождествляют с правами доступа (permissions). Это не является грубой ошибкой, но и не совсем верно.

Обратите внимание на 3-ю группу. Здесь тип файла определяет не характер содержащейся в нем информации (текст, изображение, музыка и т. д.), а особенности низкоуровневого ввода-вывода. По этому критерию ядро разделяет все файлы на следующие типы:

  • Обычный файл (regular file) — эти файлы предназначены для хранения данных. Бинарники и библиотеки также относятся к обычным файлам.
  • Символьное устройство (character device)..
  • Блочное устройство (block device).
  • Каталог (directory).
  • Символическая ссылка (symbolic link) — указывает на другие файлы. Она создается программой In с флагом -s.
  • Канал FIFO— именованные каналы FIFO (First In First Out) участвуют в межпроцессном взаимодействии.
  • Сокет (socket) — сокеты — универсальное средство межпроцессного взаимодействия между разнородными системами. Именно при помощи сокетов компьютер под управлением Windows, например, может загружать Web-страницы с Linux-сервера.

Linux — многопользовательская операционная система. Чтобы разграничить полномочия пользователей в отношении файлов, в ядре реализована концепция прав доступа, согласно которой каждый файл имеет владелы{а (user, owner) и группу (group). Владелец у файла всегда один, а в группе может состоять несколько пользователей. Кроме того, выделяют также понятие другой пользователь (other), т. е. тот, кто не обладает правами суперпользователя (root), не является владельцем и не состоит в указанной группе.

Для каждой из перечисленных категорий (владелец, группа, другие) устанавливаются индивидуальные права доступа исходя из трех перечисленных далее критериев.

1. Право на чтение (read) — дает пользователю возможность читать данные из файла. Если файл является каталогом, то право на чтение интерпретируется как возможность просматривать его содержимое.

2. Право на запись (write) — предоставляет пользователю возможность записывать данные в файл. Если же файл является каталогом, то право на запись интерпретируется как возможность создавать, удалять и переименовывать файлы, находящиеся в этом каталоге.

3. Право на выполнение (execute) — дает пользователю возможность запускать файл. Если файл является каталогом, то право на выполнение разрешает пользователю "заходить" в этот каталог, т. е. делать его текущим (current).

Понятие "текущий каталог" реализовано не в оболочке, а в ядре Linux.

Биты из диапазона от 0 до 8 режима файла описывают перечисленные права доступа для владельца, группы и остальных пользователей. Для указания прав доступа программисты могут использовать специальные именованные константы режима, соединяя их операцией побитовой дизъюнкции (ИЛИ). Чтобы получить доступ к константам режима, необходимо включить в программу заголовочный файл sys/stat.h.

Рассмотрим теперь, что означает каждый бит базовых прав доступа и какая константа предназначена для его установки.

Таблица. Назначение битов прав доступа и соответствующие им константы

Бит

Права

Константа

0

Выполнение для остальных пользователей

S_IXOTH

1

Запись для остальных пользователей

S_IWOTH

2

Чтение для остальных пользователей

S_IROTH

3

Выполнение для группы

S_IXGRP

4

Запись для группы

S_IWGRP

5

Чтение для группы

S_IRGRP

6

Выполнение для владельца

S_JXUSR

7

Запись для владельца

S_IWUSR

8

Чтение для владельца

S_IRUSR

Указать режим файла можно с помощью типа 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>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main (int argc, char ** argv)
{
int fd;
mode_t fmode = S_IRUSR;
if (argc < 2)
{
fprintf (stderr, "Too few arguments\n");
return 1;
}
fd = creat (argvfl], fmode);
if (fd == -1){fprintf (stderr, cannot create file (%s)\n", argv[1]);
return 1;
}
close (fd);
return 0;
}

В программе сначала создается переменная целого типа, в которую системный вызов creato при удачном завершении поместит дескриптор файла. В переменную fmode заносится единственная константа s_irusr, устанавливающая в единицу 8-й бит режима файла (чтение для владельца). Затем следует вызов creato, который в случае неудачи возвращает -1. Нетрудно догадаться, что он закрывает файл.

Приведенная программа довольно проста, но самое интересное еще впереди. При первом запуске все идет "по плану":

$ gcc -о creatl creatl.c
$ ./creatl myfile
$ Is -1 myfile
-r-------1 nn users 0 2006-12-06 03:16 myfile

Действительно, был создан файл нулевой длины с требуемыми правами доступа. Но если запустить программу creatl еще раз с тем же аргументом, получится сюрприз:

$ ./creatl myfile
Cannot create file (myfile)

И дело не в том, что файл уже существует, а в том, что права доступа выставлены только на чтение. Если файл существует, creat() очищает его, не меняя текущих прав доступа. Но поскольку при первом вызове программы файл был создан с правами доступа "только для чтения", то вызов creat() не смог очистить его (даже если нечего было чистить) и завершился неудачей. Эту ситуацию легко исправить:

$ chmod u+w myfile $ Is -1 myfile
-rw------1 nn users 0 2006-12-06 03:50 myfile
$ ./creatl myfile
-rw------1 nn users 0 2006-12-06 03:51 myfile

Обратите внимание, что права доступа у файла не изменились, как и ожидалось. Можно также проверить и тезис о том, что creat () очищает существующие файлы:

$ echo hello > myfile
$ cat myfile
hello
$ ./creatl myfile
$ cat myfile
$

Комментарии (0)

RSS feed Comments

Написать комментарий

smaller | bigger

busy
 

Регистрация




Top