Системни разговори в Linux
Системните повиквания, предоставени от ядрото на Linux, са изложени на езика за програмиране C чрез glibc. Когато се използва системно повикване, вие комуникирате с операционната система и при връщане операционната система комуникира с вас чрез параметрите, които се връщат към функциите на системното повикване (връща стойности).
Stat System Call:
Stat system call е системно повикване в Linux, за да се провери състоянието на файл, като например да се провери кога файлът е бил достъпен. Системното повикване stat () всъщност връща файлови атрибути. Файловите атрибути на inode се връщат основно от функцията Stat (). Inode съдържа метаданните на файла. Inode съдържа: вида на файла, размера на файла, когато файлът е бил достъпен (модифициран, изтрит), което е времеви печати, и пътя на файла, потребителския идентификатор и идентификатора на групата, връзки към файла и физически адрес на съдържанието на файла.
Можем да кажем, че inode съдържа всички данни, необходими за системното повикване stat () и това е индексният номер на файла, който се записва в таблицата на inode. Всеки път, когато създавате файл, се създава номер на inode за този файл. С помощта на системно извикване stat могат да се преглеждат системните таблици.
Синтаксис на системно обаждане C Stat:
За да използвате системното повикване stat в езика за програмиране C, трябва да включите следния заглавен файл:
#includeStat се използва за получаване на състоянието на файл. Синтаксисът на системното повикване C stat може да не е еднакъв за всяка операционна система. В Linux синтаксисът за системно повикване stat е както следва:
int stat (const char * path, struct stat * buf)Типът на връщане на функцията в инт, ако функцията се изпълни успешно, се връща 0, ако има грешки, ще се върне -1.
Тук const char * път указва името на файла. Ако пътят до файла е символна връзка, тогава трябва да посочите връзката вместо името на файла.
Тогава във функцията имаме a статична структура в който се съхраняват данните или информацията за файла, който използва указател с име buf, което се предава като параметър и се попълва по време на изпълнението на разговора и се чете от потребителя след разговора.
Статична структура:
Структурата на статията, която е дефинирана в
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;
;
Описание:
- st_dev: Това е идентификаторът на устройството, в което разполагаме с нашия файл в момента.
- st_rdev: Това поле описва, че определен файл представлява конкретно устройство.
- st_ino: Това е номерът на inode или серийният номер на файла. Тъй като това е номер на индекс, той трябва да бъде уникален за всички файлове
- st_size: st_size е размерът на файла в байтове.
- st_atime: Това е последният или скорошният момент, в който е бил извършен достъп до файла.
- st_ctime: Това е скорошното време, в което състоянието или разрешенията на файла бяха променени.
- st_mtime: Това е скорошното време, в което файлът е модифициран.
- st_blksize: Това поле дава предпочитания размер на блока за I / O файлова система, който може да варира от файл до файл.
- 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 | Задайте бит за User ID | 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:
В следния код ще намерим режима на файл:
КОД:
#include#include
int main ()
// указател към статична структура
struct stat sfile;
// системно обаждане на stat
stat ("стат.c ", & sfile);
// достъп до st_mode (член на данни от stat struct)
printf ("st_mode =% o", sfile.st_mode);
връщане 0;
Компилирането и стартирането на програмата се връща както по-долу:
В този код сме предали името на файла в системното извикване на stat и след това указателя към stat struct, който е sfile. След това указателят към структурата stat се използва за достъп до st_mode, който показва режима на файла, използвайки printf оператор.
Заглавният файл
ПРИМЕР 2:
В следния код ще получим информация за файла, използвайки системно повикване stat:
КОД:
#include#include
#include
#include
void sfile (char const filename []);
int main ()
ssize_t чете;
char * буфер = 0;
size_t buf_size = 0;
printf ("Въведете името на файл за проверка: \ n");
read = getline (& buffer, & buf_size, stdin);
ако (прочетете <=0 )
printf ("getline failed \ n");
изход (1);
if (буфер [read-1] == '\ n')
буфер [read-1] = 0;
int s = отворен (буфер, O_RDONLY);
ако (s == - 1)
printf ("Файлът не съществува \ n");
изход (1);
друго
sfile (буфер);
безплатно (буфер);
връщане 0;
void sfile (char const filename [])
struct stat sfile;
if (stat (име на файл, & sfile) == - 1)
printf ("Възникна грешка \ n");
// Достъп до членове на данни на stat struct
printf ("\ nФайл st_uid% d \ n", sfile.st_uid);
printf ("\ nФайл st_blksize% ld \ n", sfile.st_blksize);
printf ("\ nФайл 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", (неподписан int) sfile.st_nlink);
printf ("\ nПотребител с разрешения за файлове \ n");
printf ((sfile.st_mode & S_IRUSR)? "r": "-");
printf ((sfile.st_mode & S_IWUSR)? "w": "-");
printf ((sfile.st_mode & S_IXUSR)? "х":"-");
printf ("\ n");
printf ("\ nФайл група разрешения \ n");
printf ((sfile.st_mode & S_IRGRP)? "r": "-");
printf ((sfile.st_mode & S_IWGRP)? "w": "-");
printf ((sfile.st_mode & S_IXGRP)? "х":"-");
printf ("\ n");
printf ("\ nДруги разрешения за файлове \ n");
printf ((sfile.st_mode & S_IROTH)? "r": "-");
printf ((sfile.st_mode & S_IWOTH)? "w": "-");
printf ((sfile.st_mode & S_IXOTH)? "х":"-");
printf ("\ n");
ИЗХОД:
В горния C код сме въвели името на файла и ако файлът не съществува, изпълнението на програмата ще бъде спряно. Това е показано на следното изображение:
Ако нашият файл съществува, ще се извика функцията sfile (n), в която сме предали името на файла. Вътре във функцията, преди всичко използвахме системно повикване Stat, ако stat () връща -1, тогава трябва да има грешка, така че съобщението ще бъде отпечатано и изпълнението на програмата ще бъде спряно.
След това в оператора printf използвахме името на функцията и разделителя на точки за достъп до членовете на данните на статична структура.
След това за режима на файла имаме достъп до макросите или флаговете на st_mode. Тук логически и оператор се използва за отпечатване на съответните режими. Проверихме за разрешения за потребител, група и други за посочения файл (името на файла, въведено от потребителя).
С това можете да видите как да използвате системното повикване stat от езика за програмиране C, за да получите информация от ядрото на OS за файлове. Ако имате въпрос, не се колебайте да ни кажете чрез раздел за коментари.