Московский физико-технический институт
Опубликован: 16.09.2004 | Доступ: свободный | Студентов: 7774 / 1593 | Оценка: 4.44 / 4.28 | Длительность: 15:33:00
Лекция 8:

Организация файловой системы в UNIX. Работа с файлами и директориями. Понятие о memory mapped файлах

Операция создания файла. Системный вызов creat() . При обсуждении системного вызова open() подробно рассказывалось о его использовании для создания нового файла. Для этих же целей можно использовать системный вызов creat() , являющийся, по существу, урезанным вариантом вызова open() (о значении флага O_TRUNC для системного вызова open() будет сказано чуть ниже).

Системный вызов creat()

Прототип системного вызова

#include <fcntl.h>

int creat(char *path, int mode);

Описание системного вызова

Системный вызов creat эквивалентен системному вызову open() с параметром flags, установленным в значение O_CREAT | O_WRONLY | O_TRUNC.

Параметр path является указателем на строку, содержащую полное или относительное имя файла.

Если файла с указанным именем не существовало к моменту системного вызова, он будет создан и открыт только для выполнения операций записи. Если файл уже существовал, то он открывается также только для операции записи, при этом его длина уменьшается до 0 с одновременным сохранением всех других атрибутов файла.

Параметр mode устанавливает атрибуты прав доступа различных категорий пользователей к новому файлу при его создании. Этот параметр задается как сумма следующих восьмеричных значений:

  • 0400 – разрешено чтение для пользователя, создавшего файл.
  • 0200 – разрешена запись для пользователя, создавшего файл.
  • 0100 – разрешено исполнение для пользователя, создавшего файл.
  • 0040 – разрешено чтение для группы пользователя, создавшего файл.
  • 0020 – разрешена запись для группы пользователя, создавшего файл.
  • 0010 – разрешено исполнение для группы пользователя, создавшего файл.
  • 0004 – разрешено чтение для всех остальных пользователей
  • 0002 – разрешена запись для всех остальных пользователей
  • 0001 – разрешено исполнение для всех остальных пользователей

При создании файла реально устанавливаемые права доступа получаются из стандартной комбинации параметра mode и маски создания файлов текущего процесса umask, а именно – они равны mode & ~umask.

Возвращаемое значение

Системный вызов возвращает значение файлового дескриптора для открытого файла при нормальном завершении и значение -1 при возникновении ошибки.

Операция чтения атрибутов файла. Системные вызовы stat() , fstat() и lstat() . Для чтения всех атрибутов файла в специальную структуру могут применяться системные вызовы stat() , fstat() и lstat() . Разъяснение понятий жесткой и мягкой (символической) связи, встречающихся в описании системных вызовов, будет дано позже при рассмотрении операций связывания файлов.

Системные вызовы для чтения атрибутов файла

Прототипы системных вызовов

#include <sys/stat.h>
#include <unistd.h>
int stat(char *filename, 
         struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(char *filename, 
          struct stat *buf);

Описание системных вызовов

Настоящее описание не является полным описанием этих системных вызовов, а приспособлено для целей данного курса. Для получения полного описания обращайтесь в UNIX Manual.

Системные вызовы stat , fstat и lstat служат для получения информации об атрибутах файла.

Системный вызов stat читает информацию об атрибутах файла, на имя которого указывает параметр filename, и заполняет ими структуру, расположенную по адресу buf. Заметим, что имя файла должно быть полным, либо должно строиться относительно той директории, которая является текущей для процесса, совершившего вызов. Если имя файла относится к файлу типа "связь", то читается информация (рекурсивно!) об атрибутах файла, на который указывает символическая связь.

Системный вызов lstat идентичен системному вызову stat за одним исключением: если имя файла относится к файлу типа "связь", то читается информация о самом файле типа "связь".

Системный вызов fstat идентичен системному вызову stat , только файл задается не именем, а своим файловым дескриптором (естественно, файл к этому моменту должен быть открыт).

Для системных вызовов stat и lstat процессу не нужны никакие права доступа к указанному файлу, но могут понадобиться права для поиска во всех директориях, входящих в специфицированное имя файла.

Структура stat в различных версиях UNIX может быть описана по-разному. В Linux она содержит следующие поля:

struct stat {
dev_t st_dev; 
  /* устройство, на котором 
     расположен файл */
ino_t st_ino; 
  /* номер индексного узла для файла */ 
mode_t st_mode; 
  /* тип файла и права доступа к нему */
nlink_t st_nlink; 
  /* счетчик числа жестких связей */
uid_t st_uid; 
  /* идентификатор пользователя владельца */
gid_t st_gid; 
  /* идентификатор группы владельца */
dev_t st_rdev;
  /*тип устройства для специальных файлов 
    устройств*/
off_t st_size; 
  /* размер файла в байтах (если определен 
     для данного типа файлов) */
unsigned long st_blksize; 
  /* размер блока для файловой системы */
unsigned long st_blocks; 
  /* число выделенных блоков */
time_t st_atime; 
  /* время последнего доступа к файлу */
time_t st_mtime; 
  /* время последней модификации файла */
time_t st_ctime; 
  /* время создания файла */
}

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

  • S_ISLNK(m) – файл типа "связь"?
  • S_ISREG(m)регулярный файл?
  • S_ISDIR(m) – директория?
  • S_ISCHR(m) – специальный файл символьного устройства?
  • S_ISBLK(m) – специальный файл блочного устройства?
  • S_ISFIFO(m)файл типа FIFO?
  • S_ISSOCK(m) – файл типа "socket"?

Младшие 9 бит поля st_mode определяют права доступа к файлу подобно тому, как это делается в маске создания файлов текущего процесса.

Возвращаемое значение

Системные вызовы возвращают значение 0 при нормальном завершении и значение -1 при возникновении ошибки.

лия логовина
лия логовина

организовать двустороннюю поочередную связь процесса-родителя и процесса-ребенка через pipe, используя для синхронизации сигналы sigusr1 и sigusr2.

Макар Оганесов
Макар Оганесов