Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учеб.пос.СП.doc
Скачиваний:
28
Добавлен:
31.03.2015
Размер:
1.33 Mб
Скачать
    1. Жесткие и символические ссылки

Запись в файле каталога, содержащая имя и номер индексного узла, называется жесткой ссылкой. Существует еще один тип ссылок – символические ссылки. Вы получаете жесткую ссылку, когда создаете файл любого типа, включая каталоги. Можно создать дополнительные жесткие ссылки на файлы, не являющиеся каталогами, с помощью системного вызова link:

link - создает жесткую ссылку

#include <unistd.h>

int link (

const char *oldpath, /* старое имя файла */

const char *newpath /* новое имя файла */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки в переменной errno) */

Первый аргумент (oldpath) должен быть именем существующей жесткой ссылки - она представляет номер используемого индексного узла. Второй аргумент (newpath) задает имя новой жесткой ссылки. Старая и новая ссылки абсолютно равноправны, так как Unix не различает первичные и вторичные ссылки. Процесс, создающий жесткую ссылку, должен иметь право на запись в каталог, где она будет размещаться. Имени ссылки, представленной во втором аргументе, не должно существовать - системный вызов link не умеет изменять существующие ссылки. В случае необходимости, существующая ссылка должна быть сначала удалена вызовом unlink или переименована вызовом rename. Это единственный способ переименовать каталог без полного копирования его содержимого:

rename - переименовывает файл

#include <stdio.h>

int rename (

const char *oldpath, /* старое полное имя */

const char *newpath /* новое полное имя */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки в переменной errno) */

Вызов rename выполняет примерно следующую последовательность действий:

  • eсли newpath существует, то он удаляется с помощью unlink или rmdir;

  • выполняется link, даже если oldpath является каталогом;

  • вызовом unlink или rmdir удаляется oldpath.

Если oldpath является символической ссылкой, то rename работает с ней, а не с тем, на что она ссылается.

    1. Системный вызов getcwd

Это очень простой системный вызов, который служит для получения имени текущего каталога:

getcwd - возвращает полное имя текущего каталога

#include <unistd.h>

char *getcwd (

char *buf, /* старое имя файла */

size_t bufsize /* новое имя файла */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки в переменной errno) */

    1. Отображение метаданных файла

Индексный узел содержит полный набор метаданных о файле – все, кроме имени, которое в действительности никак не связано с индексным узлом и данными, на которые он указывает. Для получения информации из индексных узлов, существуют три стандартных системных вызова - stat, lstat и fstat и одна очень известная команда - ls.

stat - возвращает сведения о файле по его имени

#include <sys/stat.h>

int stat (

const char *path, /* полное имя файла */

struct stat * buf /* возвращаемая информация */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки в переменной errno) */

lstat - возвращает сведения о файле по его имени без разыменования символических ссылок

#include <sys/stat.h>

int lstat (

const char *path, /* полное имя файла */

struct stat * buf /* возвращаемая информация */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки в переменной errno) */

fstat - возвращает сведения о файле по дескриптору

#include <sys/stat.h>

int f stat (

const char *path, /* дескриптор файла */

struct stat * buf /* возвращаемая информация */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки в переменной errno) */

Системный вызов stat принимает полное имя файла и находит соответствующий ему индексный узел. Вызов fstat принимает дескриптор открытого файла и отыскивает соответствующий индексный узел в таблице активных узлов ядра. Вызов lstat аналогичен вызову stat за одним исключением – если в качестве имени файла была передана символическая ссылка, то будет возвращена информация о самой ссылке, а не об объекте, который она представляет. Все три вызова возвращают одни и те же метаданные, через структуру типа stat, в первом аргументе. Ниже приводится определение структуры stat:

struct stat {

dev_t st_dev /* идентификатор устройства файловой системы */

ino_t st_ino; /* номер индексного узла */

mode_t st_mode; /* режим */

nlink_t st_nlink; /* количество жестких ссылок */

uid_t st_uid; /* идентификатор пользователя */

gid_t st_gid; /* идентификатор группы */

dev_t st_rdev; /* идентификатор устройства */

off_t st_size; /* размер в байтах */

time_t st_atime; /* время последнего обращения */

time_t st_mtime; /* время последнего изменения */

time_t st_ctime; /* время последнего изменения индексного узла */

blksize_t st_blksize; /* оптимальный размер блока для операций ввода-вывода */

blkcnt_t st_blocks; /* количество блоков по 512 байт */

};