Системни разговори

Stat System Call Урок за Linux

Stat System Call Урок за Linux

Системни разговори в 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, трябва да включите следния заглавен файл:

#include

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

int stat (const char * path, struct stat * buf)

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

Тук const char * път указва името на файла. Ако пътят до файла е символна връзка, тогава трябва да посочите връзката вместо името на файла.

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

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

Структурата на статията, която е дефинирана в заглавният файл съдържа следните полета:

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: Това поле дава предпочитания размер на блока за I / O файлова система, който може да варира от файл до файл.
  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 Задайте бит за 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 оператор.

Заглавният файл се използва, за да можете да използвате системно повикване stat. Заглавният файл е стандартният входно / изходен библиотечен файл, така че да можете да използвате printf или scanf във вашия C код.

ПРИМЕР 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 за файлове.  Ако имате въпрос, не се колебайте да ни кажете чрез раздел за коментари.

Как да променяте настройките на мишката и тъчпада с помощта на Xinput в Linux
Повечето дистрибуции на Linux се доставят с библиотека “libinput” по подразбиране за обработка на входни събития в системата. Той може да обработва вх...
Пренастройте бутоните на мишката си по различен начин за различен софтуер с X-Mouse Button Control
Може би се нуждаете от инструмент, който може да промени контрола на мишката с всяко приложение, което използвате. Ако случаят е такъв, можете да изпр...
Преглед на безжична мишка на Microsoft Sculpt Touch
Наскоро прочетох за Microsoft Sculpt Touch безжична мишка и реших да я купя. След като го използвах известно време, реших да споделя опита си с него. ...