Управление ресурсами в ОС UNIX

       

Возвращают дескриптор файла Преобразуют


#include <sys/types.h>

#include <sys/stat.h>

int stat(const char *name, struct stat *stbuf)

int fstat(int fd, struct stat *stbuf)

Оба системных вызова помещают информацию о файле (в первом случае специфицированным именем name, а во втором - дескриптором файла fd) в структурную переменную, на которую указывает stbuf. Вызывающая функция должна позаботиться о резервировании места для возвращаемой информации; в случае успеха возвращается 0, в противном случае -1 и код ошибки в errno. Описание структуры stat содержится в файле <sys/stat.h>. С небольшими модификациями она имеет вид:

struct stat

{

dev_t st_dev; /* device file */

ino_t st_ino; /* file serial inode */

ushort st_mode; /* file mode */

short st_nlink; /* number of links */

ushort st_uid; /* user ID */

ushort st_gid; /* group ID */

dev_t st_rdev; /* device ident */

off_t st_size; /* size of file */

time_t st_atime; /* last access time */



time_t st_mtime; /* last modify time */

time_t st_ctime; /* last status change */

}

Поле st_mode содержит флаги, описывающие файл. Флаги несут следующую информацию:

S_IFMT 0170000 - тип файла

S_IFDIR 0040000 - каталог

S_IFCHR 0020000 - байт-ориентированный специальный файл

S_IFBLK 0060000 - блок-ориентированный специальный файл

S_IFREG 0100000 - обычный файл

S_IFFIFO 0010000 - дисциплина FIFO

S_ISUID 04000 - идентификатор владельца

S_ISGID 02000 - идентификатор группы

S_ISVTX 01000 - сохранить свопируемый текст

S_ISREAD 00400 - владельцу разрешено чтение

S_IWRITE 00200 - владельцу разрешена запись

S_IEXEC 00100 - владельцу разрешено выполнение.

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

Большинство системных вызовов, работающих с каталогами, оперируют структурой dirent, определенной в заголовочном файле <dirent.h>

struct dirent

{

ino_t d_ino; /* номер индексного дескриптора */

char d_name[DIRSIZ]; /* имя файла */

}

Создание и удаление каталога выполняется системным вызовом mkdir():


#include <sys/types.h>

#include <sys/stat.h>

int mkdir (char *pathname, mode_t mode);

При создании каталога посредством системного вызова rmdir() в него помещается две ссылки (. и ..).

#include <unistd.h>

int rmdir (char *pathname);

Открытие и закрытие каталога выполняется системными вызовами opendir() и closedir():

#include <sys/types.h>

#include <dirent.h>

DIR *opendir (char *dirname);

При успешном открытии каталога системный вызов возвращает указатель на переменную типа DIR, являющуюся дескриптором каталога, определенную в файле <dirent.h> и используемую при чтении и записи в каталог. При неудачном вызове возвращается значение NULL.

#include <dirent.h>

int closedir (DIR *dirptr); где dirptr - дескриптор каталога.

Для смены каталога служит системный вызов chdir():

#include <unistd.h>

int chdir (char *pathname);

Чтение записей каталога выполняется системным вызовом readdir():

#include <sys/types.h>

#include <dirent.h>

struct dirent *readdir (DIR *dirptr);

Системный вызов readdir() по номеру дескриптора каталога возвращает очередную запись из каталога в структуру dirent, либо нулевой указатель при достижении конца каталога. При успешном чтении, указатель каталога перемещается к следующей записи.

Дополнительный системный вызов

void rewinddir (DIR *dirptr);

переводит указатель каталога к первой записи каталога.


Содержание раздела