Системные вызовы

Stat System Call Linux Учебное пособие

Stat System Call Linux Учебное пособие

Системные вызовы Linux

Системные вызовы, предоставляемые ядром linux, доступны на языке программирования C через glibc.  Когда используется системный вызов, вы общаетесь с ОС, и при возврате ОС общается с вами через параметры, которые возвращаются функциям системного вызова (возвращаемые значения).

Статистический системный вызов:

Системный вызов stat - это системный вызов в Linux для проверки состояния файла, например, чтобы проверить, когда к файлу был осуществлен доступ. Системный вызов stat () фактически возвращает атрибуты файла. Атрибуты файла inode в основном возвращаются функцией Stat (). Inode содержит метаданные файла. Inode содержит: тип файла, размер файла, время доступа к файлу (изменение, удаление), то есть временные метки, а также путь к файлу, идентификатор пользователя и идентификатор группы, ссылки на файл. , и физический адрес содержимого файла.

Можно сказать, что индексный дескриптор содержит все данные, необходимые для системного вызова stat (), и это номер индекса для файла, который сохраняется в таблице индексных дескрипторов. Каждый раз, когда вы создаете файл, создается номер inode для этого файла. Используя системный вызов stat, можно просмотреть системные таблицы.

Синтаксис системного вызова C Stat:

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

#включать

Stat используется для получения статуса файла. Синтаксис системного вызова C stat может отличаться для каждой операционной системы. В Linux синтаксис системного вызова stat выглядит следующим образом:

int stat (const char * путь, struct stat * buf)

Тип возвращаемого значения функции в int, если функция выполнена успешно, возвращается 0, если есть какие-либо ошибки, возвращается -1.

Здесь const char * путь указывает имя файла. Если путь к файлу является символьной ссылкой, вам нужно указать ссылку вместо имени файла.

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

Структура статистики:

Структура статистики, которая определена в Заголовочный файл содержит следующие поля:

struct stat

mode_t st_mode;
ino_t st_ino;
dev_t st_dev;
dev_t st_rdev;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
off_t st_size;
struct timspec st_atim;
struct timspec st_mtim;
struct timspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
;

Описание:

  1. st_dev: Это идентификатор устройства, на котором сейчас находится наш файл.
  2. st_rdev: Это поле описывает, что конкретный файл представляет конкретное устройство.
  3. st_ino: Это номер inode или серийный номер файла. Поскольку это порядковый номер, он должен быть уникальным для всех файлов
  4. st_size: st_size - размер файла в байтах.
  5. st_atime: Это последний раз или последнее время, когда к файлу обращались.
  6. st_ctime: Это последнее время, когда статус или права доступа к файлу были изменены.
  7. st_mtime: Это последнее время, когда файл был изменен.
  8. st_blksize: В этом поле указывается предпочтительный размер блока для файловой системы ввода-вывода, который может варьироваться от файла к файлу.
  9. st_blocks: В этом поле указано общее количество блоков, кратное 512 байтам.
  10. st_nlink: В этом поле указано общее количество жестких ссылок.
  11. st_uid: В этом поле указывается идентификатор пользователя.
  12. st_gid: В этом поле указывается идентификатор группы.
  13. st_mode: Он указывает права доступа к файлу, сообщает режимы файла. Ниже приведены флаги, которые следует определить для поля st_mode:
Флаги Описание Значение флага
S_IFMT Битовая маска, используемая для получения значения режима файла 0170000
S_IFSOCK Файловая константа сокета 0140000
S_IFLINK Файловая константа символьной ссылки 0120000
S_IFREG Файловая константа для обычного файла 0100000
S_IFBLK Файловая константа для блочного файла 0060000
S_IFDIR Файловая константа для файла каталога 0040000
S_IFCHR Файловая константа для символьного файла 0020000
S_IFIFO Файловая константа fifo 0010000
S_ISUID Установить бит идентификатора пользователя 0004000
S_ISGID Установить бит идентификатора группы 0002000
S_ISVTX Прикрепленный бит, обозначающий общий текст 0001000
S_IRWXU Права владельца (чтение, запись, выполнение) 00700
S_IRUSR Разрешения на чтение для владельца 00400
S_IWUSR Права на запись для владельца 00200
S_IXUSR Выполнить разрешения для владельца 00100
S_IRWXG Групповые разрешения (чтение, запись, выполнение) 00070
S_IRGRP Разрешения на чтение для группы 00040
S_IWGRP Разрешения на запись для группы 00020
S_IXGRP Выполнить разрешения для группы 00010
S_IRWXO Разрешения для других (чтение, запись, выполнение) 00007
S_IROTH Разрешения на чтение для других 00004
S_IWOTH Разрешения на запись для других 00002
S_IXOTH Выполнить разрешения для других 00001

Как использовать системный вызов Stat:

В следующем примере показано, как использовать системный вызов stat на языке программирования C в Linux, Ubuntu.

ПРИМЕР 1:

В следующем коде мы собираемся найти режим файла:

КОД:

#включать
#включать
int main ()

// указатель на структуру stat
struct stat sfile;
// системный вызов stat
stat ("stat.c ", & sfile);
// доступ к st_mode (член данных структуры stat)
printf ("st_mode =% o", sfile.st_mode);
возврат 0;

Компиляция и запуск программы возвращаются, как показано ниже:

В этом коде мы передали имя файла в системном вызове stat, а затем указатель на структуру stat, которая является sfile. Затем указатель на структуру stat используется для доступа к st_mode, который отображает режим файла с помощью оператора printf.

Заголовочный файл используется, чтобы вы могли использовать системный вызов stat. Заголовочный файл - это стандартный файл библиотеки ввода / вывода, поэтому вы можете использовать printf или scanf в своем коде C.

ПРИМЕР 2:

В следующем коде мы собираемся получить информацию о файле с помощью системного вызова stat:

КОД:

#включать
#включать
#включать
#включать
void sfile (char const filename []);
int main ()
ssize_t прочитано;
символ * буфер = 0;
size_t buf_size = 0;
printf ("Введите имя файла для проверки: \ n");
чтение = getline (& буфер, & buf_size, stdin);
если (читать <=0 )
printf ("ошибка getline \ n");
выход (1);

if (buffer [read-1] == '\ n')
буфер [чтение-1] = 0;

int s = open (буфер, O_RDONLY);
if (s == - 1)
printf ("Файл не существует \ n");
выход (1);

еще
sfile (буфер);

бесплатно (буфер);
возврат 0;

void sfile (char const filename [])
struct stat sfile;
if (stat (имя файла, & sfile) == - 1)
printf ("Произошла ошибка \ n");

// Доступ к элементам данных структуры stat
printf ("\ nFile st_uid% d \ n", sfile.st_uid);
printf ("\ nFile st_blksize% ld \ n", sfile.st_blksize);
printf ("\ nFile st_gid% d \ n", sfile.st_gid);
printf ("\ nФайл st_blocks% ld \ n", sfile.st_blocks);
printf ("\ nФайл st_size% ld \ n", sfile.st_size);
printf ("\ nFile st_nlink% u \ n", (unsigned int) sfile.st_nlink);
printf ("\ nПользователь с правами доступа к файлу \ n");
printf ((sfile.st_mode и S_IRUSR)? "р":"-");
printf ((sfile.st_mode и S_IWUSR)? «w»: «-»);
printf ((sfile.st_mode и S_IXUSR)? "Икс":"-");
printf ("\ п");
printf ("\ nГруппа разрешений для файлов \ n");
printf ((sfile.st_mode и S_IRGRP)? "р":"-");
printf ((sfile.st_mode и S_IWGRP)? «w»: «-»);
printf ((sfile.st_mode и S_IXGRP)? "Икс":"-");
printf ("\ п");
printf ("\ nДругие разрешения для файлов \ n");
printf ((sfile.st_mode и S_IROTH)? "р":"-");
printf ((sfile.st_mode и S_IWOTH)? «w»: «-»);
printf ((sfile.st_mode и S_IXOTH)? "Икс":"-");
printf ("\ п");

ВЫХОД:

В приведенном выше коде C мы ввели имя файла, и если файл не существует, выполнение программы будет остановлено. Это показано на следующем изображении:

Если наш файл существует, будет вызвана функция sfile (n), в которую мы передали имя файла. Внутри функции, прежде всего, мы использовали системный вызов Stat, если stat () возвращает -1, тогда должна быть какая-либо ошибка, поэтому будет напечатано сообщение и выполнение программы будет остановлено.

Затем в операторе printf мы использовали имя функции и разделитель точек для доступа к элементам данных stat struct.

Затем для режима файла мы получили доступ к макросам или флагам st_mode. Здесь логический оператор и используется для печати соответствующих режимов. Мы проверили разрешения для пользователя, группы и других для указанного файла (имя файла введено пользователем).

Здесь вы можете увидеть, как использовать системный вызов stat из языка программирования C для получения информации из ядра ОС о файлах.  Если у вас есть вопросы, не стесняйтесь, сообщите нам через раздел комментариев.

OpenTTD против Simutrans
Создание собственного транспортного симулятора может быть увлекательным, расслабляющим и чрезвычайно увлекательным занятием. Вот почему вам нужно попр...
Учебник OpenTTD
OpenTTD - одна из самых популярных бизнес-симуляторов. В этой игре вам нужно создать замечательный транспортный бизнес. Тем не менее, вы начнете в нач...
SuperTuxKart для Linux
SuperTuxKart - отличная игра, созданная для того, чтобы бесплатно познакомить вас с Mario Kart в вашей системе Linux. Играть в нее довольно сложно и в...