Системные вызовы, предоставляемые ядром Linux, доступны на языке программирования C через glibc. Когда используется системный вызов, вы общаетесь с ОС, а при возврате ОС общается с вами через параметры, которые возвращаются функциям системного вызова (возвращаемые значения).
Статистический системный вызов:
Системный вызов stat - это системный вызов в Linux для проверки состояния файла, например, для проверки того, когда к файлу был осуществлен доступ. Системный вызов stat () фактически возвращает атрибуты файла. Атрибуты файла inode в основном возвращаются функцией Stat (). Inode содержит метаданные файла. Inode содержит: тип файла, размер файла, время доступа к файлу (изменение, удаление), то есть временные метки, а также путь к файлу, идентификатор пользователя и идентификатор группы, ссылки на файл. , и физический адрес содержимого файла.
Можно сказать, что индексный дескриптор содержит все данные, необходимые для системного вызова stat (), и это номер индекса для файла, который сохраняется в таблице индексных дескрипторов. Каждый раз, когда вы создаете файл, создается номер inode для этого файла. Системные таблицы можно просмотреть с помощью системного вызова stat.
Синтаксис системного вызова C Stat:
Чтобы использовать системный вызов stat на языке программирования C, вы должны включить следующий файл заголовка:
#включают
Stat используется для получения статуса файла. Синтаксис системного вызова C stat может отличаться для каждой операционной системы. В Linux синтаксис системного вызова stat выглядит следующим образом:
intштат(const символ *дорожка, структураштат*бух)
Тип возвращаемого значения функции в int, если функция выполнена успешно, возвращается 0, если есть какие-либо ошибки, возвращается -1.
Здесь const char * путь указывает имя файла. Если путь к файлу является символической ссылкой, вам нужно указать ссылку вместо имени файла.
Затем в функции у нас есть структура stat, в которой хранятся данные или информация о файле, которая использует указатель с именем буф который передается как параметр, заполняется во время выполнения вызова и читается пользователем после вызова.
Структура статистики:
Структура статистики, которая определена в заголовочном файле, содержит следующие поля:
структураштат{
mode_t st_mode;
ино_т ст_ино;
dev_t st_dev;
dev_t st_rdev;
nlink_t st_nlink;
uid_t st_uid;
gid_t st_gid;
off_tst_size;
структураtimspec st_atim;
структураtimspec st_mtim;
структураtimspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
};
Описание:
- st_dev: Это идентификатор устройства, на котором сейчас находится наш файл.
- st_rdev: Это поле описывает, что конкретный файл представляет конкретное устройство.
- st_ino: Это номер inode или серийный номер файла. Поскольку это порядковый номер, он должен быть уникальным для всех файлов.
- st_size: st_size - размер файла в байтах.
- st_atime: Это последний или последний раз, когда к файлу обращались.
- st_ctime: Это время последнего изменения статуса или прав доступа к файлу.
- st_mtime: Это время последнего изменения файла.
- st_blksize: В этом поле указывается предпочтительный размер блока для файловой системы ввода-вывода, который может варьироваться от файла к файлу.
- st_blocks: В этом поле указано общее количество блоков, кратное 512 байтам.
- st_nlink: В этом поле указано общее количество жестких ссылок.
- st_uid: В этом поле указывается идентификатор пользователя.
- st_gid: В этом поле указывается идентификатор группы.
- 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главный()
{
// указатель на структуру stat
структурагосударственный sfile;
// системный вызов 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:
КОД:
#включают#включают
#включают
#включают
пустотаsfile(символ constимя файла[]);
intглавный(){
ssize_t читать;
символ*буферзнак равно 0;
size_tbuf_sizeзнак равно 0;
printf ('Введите имя файла для проверки: п');
читатьзнак равноGetline(&буфер, &buf_size,стандартный ввод);
если (читать<=0 ){
printf ('getline не удалось п');
выход (1);
}
если (буфер[читать-1] == ' п'){
буфер[читать-1] знак равно 0;
}
intsзнак равнооткрытым(буфер,O_RDONLY);
если(s== -1){
printf ('Файл не существует п');
выход (1);
}
еще{
sfile(буфер);
}
бесплатно (буфер);
возвращение 0;
}
пустотаsfile(символ constимя файла[]){
структурагосударственный sfile;
если(штат(имя файла, &sfile)== -1){
printf ('Возникла ошибка п');
}
// Доступ к элементам данных структуры stat
printf (' пФайл st_uid% d п',sfile.st_uid);
printf (' пФайл st_blksize% ld п',sfile.st_blksize);
printf (' пФайл st_gid% d п',sfile.st_gid);
printf (' пФайл st_blocks% ld п',sfile.st_blocks);
printf (' пФайл st_size% ld п',sfile.st_size);
printf (' пФайл st_nlink% u п',(беззнаковый int)sfile.st_nlink);
printf (' пПользователь с правами доступа к файлам п');
printf ((sfile.st_mode &S_IRUSR)? 'р':'-');
printf ((sfile.st_mode &S_IWUSR)? 'в':'-');
printf ((sfile.st_mode &S_IXUSR)? 'Икс':'-');
printf (' п');
printf (' пГруппа разрешений для файлов п');
printf ((sfile.st_mode &S_IRGRP)? 'р':'-');
printf ((sfile.st_mode &S_IWGRP)? 'в':'-');
printf ((sfile.st_mode &S_IXGRP)? 'Икс':'-');
printf (' п');
printf (' пПрава доступа к файлам Другое п');
printf ((sfile.st_mode &S_IROTH)? 'р':'-');
printf ((sfile.st_mode &S_IWOTH)? 'в':'-');
printf ((sfile.st_mode &S_IXOTH)? 'Икс':'-');
printf (' п');
}
ВЫХОД:
В приведенном выше коде C мы ввели имя файла, и если файл не существует, выполнение программы будет остановлено. Это показано на следующем изображении:
Если наш файл существует, будет вызвана функция sfile (n), в которую мы передали имя файла. Внутри функции, прежде всего, мы использовали системный вызов Stat, если stat () возвращает -1, тогда должна быть какая-либо ошибка, поэтому будет напечатано сообщение и выполнение программы будет остановлено.
Затем в операторе printf мы использовали имя функции и разделитель точек для доступа к элементам данных стат структура .
Затем для режима файла мы получили доступ к макросам или флагам st_mode. Здесь логический оператор и используется для печати соответствующих режимов. Мы проверили разрешения для пользователя, группы и других пользователей для указанного файла (имя файла введено пользователем).
Здесь вы можете увидеть, как использовать системный вызов stat из языка программирования C для получения информации из ядра ОС о файлах. Если у вас есть вопросы, не стесняйтесь, сообщите нам через раздел комментариев.