Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиСП теория 4 семестра - методичка слайдов Бранцевич Петр Юльянович 2009.doc
Скачиваний:
171
Добавлен:
15.06.2014
Размер:
1.75 Mб
Скачать

2.11 Символическая ссылка

#include <unistd.h>

int symlink(const char *oldpath, const char *newpath);

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

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

EACCESS – у вызывающего процесса отсутствует разрешение на поиск для компонента пути oldpath или у вызывающего процесса нет разрешения на запись в каталог, содержащий newpath.

EEXIST – файл newpath уже существует — системный вызов symlink() не переписывает существующую запись каталога.

EFAULT – параметр oldpath или newpath содержит недопустимый указатель.

EIO – произошла внутренняя ошибка ввода-вывода.

ELOOP – при разрешении пути oldpath или newpath встретилось слишком много символических ссылок.

EMLINK – в структуре inode, на которую указывает oldpath, уже достигнуто максимальное число указывающих на нее ссылок.

ENAMETOOLONG – слишком длинное значение oldpath или newpath.

ENOENT – компонент пути oldpath или newpath не существует.

ENOMEM – недостаточно памяти для выполнения данного запроса.

ENOSPC – на устройстве, которому принадлежит newpath, недостаточно места для создания новой записи каталога.

ENOTDIR – компонент пути oldpath или newpath не является каталогом.

EPERM – файловая система, которой принадлежит newpath, не допускает создания но­вых символических ссылок.

EROFS – путь newpath принадлежит файловой системе, доступной только для чтения.

2.12 Удаление ссылки (или имени файла)

#include <unistd.h>

int unlink(const char *pathname);

Этот системный вызов удаляет имя файла. При этом анализируется число жестких ссылок, которые имеются у файла, и если это была последней ссылкой на файл, то файл удаляется сам. Если при этом удаляется последняя ссылка, с которой работают, то удаление произойдет только после завершения работы. Если же это символическая ссылка, то удаляется только ссылка, а файл не разрушается.

В случае ошибки вызов возвращает -1 и присваивает переменной errno одно из следующих значений:

EACCESS – у вызывающего процесса нет разрешения на запись в родительский каталог файла pathname или у вызывающего процесса нет разрешения на поиск для компонента пути pathname.

EFAULT – параметр pathname содержит недопустимый указатель.

ЕIO – произошла ошибка ввода-вывода.

EISDIR – путь pathname ссылается на каталог.

ELOOP – при прохождении pathname встретилось слишком много символических ссы­лок.

ENAMETOOLONG – слишком длинное значение pathname.

ENOENT – компонент пути pathname не существует.

ENOMEM – недостаточно памяти для выполнения данного запроса.

ENOTDIR – компонент пути pathname не является каталогом.

EPERM – система не позволяет отсоединять файлы.

EROFS – путь pathname принадлежит файловой системе, доступной только для чтения.

Системный вызов unlink() не поддерживает удаление каталогов. Для этого в приложениях следует использовать вызов rmdir(). Для упрощения бессмысленного разрушения файлов любого типа в языке С предусмотрена функция remove():

#include <stdio.h>

int remove(const char *path);

Успешный вызов remove() удаляет файл path из файловой системы и воз­вращает значение 0. Если path — это файл, то remove() вызывает unlink(); если path — это каталог, то remove() вызывает rmdir().

В случае ошибки remove() возвращает -1 и присваивает переменной errno один из допустимых кодов ошибки, определенных для unlink() и rmdir() соот­ветственно.