#include <sys/mman.h>
int msync(void *addr, size_t len, int flags);
Где flags может иметь следующие значения:
MS_ASYNC – т.е. асинхронно (изначально вызывается завершение, а потом ОС завершает запись)
MS_INVALIDATE – указывает, что все кэшированные ранее копии отображения аннулируются и синхронизируется текущее состояние данных
MS_SYNC – синхронизация выполняется синхронно
Сброс на диск всех изменений, внесенных в файл, отображается в память. В физический файл записывается или все содержимое области отображения, или участок области отображения. Синхронизация же производится, начиная с адреса addr, размером len, flags - флаги управления проведения синхронизации.
В случае успеха системный вызов msync возвращает значение 0. В случае ошибки – -1. Переменная errno может принимать следующие значения:
EINVAL – параметр flags включает оба значения, MS_SYNC и MS_ASYNC; установлен бит, отличный от трех допустимых флагов, или значение addr не выровнено по размеру страницы
ENOMEM – указанная область памяти (или ее часть) не входит в отображение
|
|
Каждый файл представляется структурой inode, которой присваивается адрес при помощи уникального для файловой системы числового значения, называемого номером inode (inode number). Inode — это и физический объект, находящийся на диске в Unix-подобной файловой системе, и концептуальная сущность, представляемая структурой данных в ядре Linux. В inode хранятся метаданные (metadata), связанные с файлом, такие, как разрешения на доступ к файлу, временная отметка, указывающая время последнего доступа к файлу, владелец, группа и размер файла, а также местоположение данных файла.
Далее приведены системные вызовы для получения значений метаданных файла:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *path, struct stat *buf);
int fstst(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);
Где параметр path – это полный путь к файлу, а fd – открытый файловый дескриптор.
Следует заметить, что системный вызов lstat отличается от stat тем, что он позволяет получить информацию о файле типа символьная ссылка.
При успешном завершении вызовов возвращается 0 и в структуру stat (рассмотренную ниже) помещаются метаданные, а при ошибке возвращается значение -1 и устанавливаются коды ошибок.
struct stat
{
1) dev_t st_dev; //устройство, на котором хранится файл
2) ino_t st_ino; //номер inode (индексного дескриптора)
3) mode_t st_mode; //режимы использования файла
4) nlink_t st_nlink; //число жестких ссылок
5) uid_t st_uid; //идентификатор пользователя владельца
6) gid_t st_gid; //идентификатор группы владельца
7) dev_t st_rdev; //если этот файл – устройство, то описано устройство, которое файл представляет
8) off_t st_size; //размер файла в байтах
9) blksize_t st_blksize; //размер блока для эффективной реализации ввода/вывода
|
|
10) blkcnt_ st_blocks; //число блоков физической файловой системы, которое
занимает файл
11) time_t st_atime; //время последнего доступа к файлу
12) time_t st_mtime; //время последней модификации метаданных файла
13) time_t st_ctime; //время последней изменения файла
}
В случае успеха все три вызова возвращают значение 0 и записывают метаданные файла в предоставленную им структуру stat. В случае ошибки они возвращают -1 и присваивают переменной errno одно из следующих значений:
EACCESS – у вызывающего процесса отсутствуют разрешения на поиск для одного из каталогов в пути path (только для функций stat () и lstat ()).
EBADF – недопустимое значение fd (только для функции fstat()).
EFAULT – параметр path или buf содержит недопустимый указатель.
ELOOP – параметр path включает слишком много символических ссылок (только для функций stat() и Istat()).
ENAMETOOLONG – слишком длинное значение параметра path (только для функций stat() и Istat()).
ENOENT – компонент пути path не существует (только для функций stat() и Istat()).
ENOMEM – недостаточно памяти для выполнения данного запроса.
ENOTDIR – компонент пути path не является каталогом (только для функций stat() и Istat()).
Использование вызовов для получения значений метаданных файла:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
static short o_ar[9]={0400,0200,0100,0040,0020,0010,0004,0002,0001}
static char perms[10]= “rwxrwxrwx”
int filedata(const char *pathname)
{
struct stat statbuf;
char d[10];
int j;
if (stat(pathname,&statbuf)==-1)
{ printf(“Ошибка stat %s\n”,pathname);
return(-1); }
for (j=0; j<9; j++)
{ if (statbuf.st_mode & o_ar[j]) d[j]=perms[j];
else d[j]=’-1’; }
d[9]=’\0’;
printf(“файл %s: \n”, pathname);
printf(“размер %ld байт \n”,statbuf.st_size);
printf(“User_id %d, Group_id %d\n”,statbuf.st_uid,statbuf.st_gid);
printf(“Права доступа: %s\n”,d);
return(0);
}
st_mode может принимать значения:
S_ISDIR - каталог
S_ISCHR - символьное устройство
S_ISBLK – блочное устройство
S_ISREG – простой файл
S_ISFIFO - канал
S_ISLINK – ссылка
S_ISSOCK – сокет
Есть системные вызовы, которые позволяют изменить права доступа к файлу:
#include <sys/types.h>
#include <sys/stat.h>
int chmod(const char *path, mode_t mode);
int fcmod(int fd, mode_t mode);
Пример такого вызова: chmod(“./text1.t”,S_TRUSR|S_IWUSR)
Оба вызова chmod() и fchmod() устанавливают для файла разрешения, указанные при помощи параметра mode. В вызове chmod() параметр path содержит относительный или абсолютный путь к модифицируемому файлу. Для вызова fсhmod() файл указывается при помощи дескриптора fd.
Допустимые значения параметра mode, представляемого непрозрачным целочисленным типом mode_t, те же, что и значения, возвращаемые в поле st_mode структуры stat. Хотя это простые целочисленные значения, они могут иметь разный смысл в разных реализациях Unix. Для формирования допустимых значений параметра mode эти константы можно объединять между собой операцией двоичного ИЛИ. Например. (S_IRUSR | S_IRGRP) устанавливает для файла разрешения, предоставляющие возможность чтения файла его владельцу и группе.
Чтобы иметь возможность изменить разрешения файла, действительный идентификатор процесса, вызывающего chmod() или fchmod(), должен совпадать с идентификатором владельца файла или же процесс должен обладать характеристикой CAP_F0WNER.
В случае успеха оба вызова возвращают значение 0. В случае ошибки оба возвращают -1 и присваивают переменной errno один из следующих кодов ошибки:
EACCESS – у вызывающего процесса нет разрешений на поиск для компонента пути path (только для chmod()).
EBADF – недопустимый дескриптор файла fd (только для fchmod()).
EFAULT – параметр path содержит недопустимый указатель (только для chmod()).
EIO – в файловой системе произошла внутренняя ошибка ввода-вывода. Это очень плохая ситуация, которая может указывать на повреждение диска или файловой системы.
ELOOP – во время разрешения пути path ядро встретило слишком много символических ссылок (только для chmod()).
ENAMETOOLONG – слишком длинное значение параметра path (только для chmod()).
ENOENT – путь path не существует (только для параметра chmod().
|
|
ENOMEM – недостаточно памяти для выполнения данного запроса.
ENOTDIR – компонент пути path не является каталогом (только для chmod()).
EPERM – действительный идентификатор вызывающего процесса не соответствует владельцу файла, и у процесса отсутствует характеристика CAP_FOWNER.
EROFS – файл находится в файловой системе, доступной только для чтения.
В структуре stat в полях st_uid и st_gid хранятся владелец и группа файла соответственно. Три системных вызова позволяют пользователю менять эти два значения:
#include <sys/types.h>
#include <unistd.h>
int chown (const char *path, uid_t owner, gid_t group);
int lchown (const char *path, uid_t owner, gid_t group);
int fchown (int fd, uid_t owner, gid_t group):,
Вызовы chown() и Ichown() определяют владение файлом, указанным при помощи пути в параметре path. Они работают одинаково для всех файлов, за исключением символических ссылок.
В случае успеха все три вызова делают владельцем файла пользователя owner, группой файла группу group и возвращают значение 0. Если параметр owner или group равен -1, то соответствующее значение не устанавливается. Только процесс, владеющий характеристикой CAP_CH0WN (обычно это процесс, принадлежащий пользователю root), может менять владельца файла. Владелец файла может сменить группу файла на любую другую, членом которой он является; процессы с характеристикой CAP_CH0WN имеют право менять группу файла на любое другое значение.
В случае ошибки вызовы возвращают -1 и присваивают переменной errno одно из следующих значений:
EACCESS – у вызывающего процесса отсутствуют разрешения на поиск для компонента пути path (только для chown() и Ichown()).
EBADF – недопустимое значение fd (только для fchown()).
EFAULT – недопустимое значение path (только для chown() и Ichown()).
EIO – внутренняя ошибка ввода-вывода.
ELOOP – во время разрешения пути path ядро встретило слишком много символических ссылок (только для chown() и Ichown()).
ENAMETOOLONG – слишком длинное значение path (только для chown() и Ichown()).
ENOENT – файл не существует.
ENOMEM – недостаточно памяти для выполнения данного запроса.
ENOTDIR – компонент пути path не является каталогом (только для chown() и lchown()).
|
|
EPERM – у вызывающего процесса отсутствуют необходимые права для изменения владельца или группы в соответствии с запросом.
EROFS – файловая система доступна только для чтения.