Stat System Call Linux Урок

Stat System Call Linux Tutorial



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

Системно обаждане на Stat:

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







Можем да кажем, че inode съдържа всички данни, необходими за системното извикване stat () и това е индексният номер за файла, който е записан в таблицата inode. Всеки път, когато създавате файл, се създава inode номер за този файл. Чрез системно извикване stat могат да се видят системните таблици.



Синтаксис на системното обаждане на C Stat:

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



#включва

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





intсъстояние(const char *път, структурасъстояние*буф)

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

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



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

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

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

структурасъстояние
{
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_tst_size;
структураtimspec st_atim;
структураtimspec st_mtim;
структураtimspec st_ctim;
blksize_t st_blksize;
blkcnt_t st_blocks;
};

Описание:

  1. st_dev: Това е идентификационният номер на устройството, в което в момента се намира нашият файл.
  2. st_rdev: Това поле описва, че определен файл представлява конкретно устройство.
  3. st_ino: Това е индексният номер или серийният номер на файла. Тъй като това е индексен номер, той трябва да бъде уникален за всички файлове
  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:

В следния код ще намерим режима на файл:

КОД:

#включва
#включва
intглавен()
{
// указател към stat struct
структурадържавен sfile;

// системно извикване на stat
състояние('stat.c', &sfile);

// достъп до st_mode (член на данни на stat struct)
printf ('st_mode = %o',sfile.st_mode);
връщане 0;
}

Компилирането и изпълнението на програмата се връща както по -долу:

В този код сме предали името на файла в системно извикване на stat и след това указателя към stat struct, който е sfile. Указателят към stat struct след това се използва за достъп до st_mode, който показва режима на файла с помощта на оператора printf.

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

ПРИМЕР 2:

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

КОД:

#включва
#включва
#включва
#включва

невалиденsfile(char constиме на файл[]);

intглавен(){
ssize_t четене;
char*буфер= 0;
size_tbuf_size= 0;

printf ('Въведете името на файл за проверка:н');
Прочети=getline(&буфер, &buf_size,stdin);

ако (Прочети<=0 ){
printf ('getline се провалин');
изход (1);
}

ако (буфер[Прочети-1] == 'н'){
буфер[Прочети-1] = 0;
}

intс=отворен(буфер,O_RDONLY);
ако(с== -1){
printf („Файлът не съществуван');
изход (1);
}
иначе{
sfile(буфер);
}
Безплатно (буфер);
връщане 0;
}

невалиденsfile(char constиме на файл[]){

структурадържавен sfile;

ако(състояние(име на файл, &sfile)== -1){
printf („Възникна грешкан');
}

// Достъп до членове на данни на stat struct
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)? 'r':'-');
printf ((sfile.st_mode &S_IWUSR)? 'в':'-');
printf ((sfile.st_mode &S_IXUSR)? 'х':'-');
printf ('н');
printf ('нГрупа за разрешения на файловен');
printf ((sfile.st_mode &S_IRGRP)? 'r':'-');
printf ((sfile.st_mode &S_IWGRP)? 'в':'-');
printf ((sfile.st_mode &S_IXGRP)? 'х':'-');
printf ('н');
printf ('нРазрешения за файлове Другин');
printf ((sfile.st_mode &S_IROTH)? 'r':'-');
printf ((sfile.st_mode &S_IWOTH)? 'в':'-');
printf ((sfile.st_mode &S_IXOTH)? 'х':'-');
printf ('н');
}

ИЗХОД:

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

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

След това в оператора printf използвахме името на функцията и разделителя на точки за достъп до членовете на данните на статична структура .

След това за режима на файла имаме достъп до макросите или флаговете на st_mode. Тук логиката и операторът се използват за отпечатване на съответните режими. Проверихме за разрешения за потребител, група и други за посочения файл (името на файла, въведено от потребителя).

С това можете да видите как да използвате системното повикване stat от езика за програмиране C, за да получите информация от ядрото на ОС за файлове. Ако имате въпроси, не се колебайте да ни кажете чрез секцията за коментари.