$ cat ./hello /* Попытка использования через символическую ссылку */
cat: ./hello: No such file or directory
$ echo hi again > hello /* Создать новое содержание файла */
$ ls -l /tmp/message /* Показать информацию об указываемом файле */
– rw-r--r-- 1 arnold devel 9 May 4 16:45 /tmp/message
$ cat /tmp/message /* ...и
содержание */
hi again
Символические ссылки создаются с помощью системного вызова
symlink
:
#include <unistd.h> /* POSIX */
int symlink(const char *oldpath, const char *newpath);
Аргумент
oldpath
содержит указываемый файл или каталог, a
newpath
является именем создаваемой символической ссылки. При успехе возвращается 0, а при ошибке (-1), возможные значения
errno
см. в справочной странице для symlink(2). У символических ссылок есть свои недостатки:
• Они занимают лишнее дисковое пространство, требуя отдельного индекса и блока данных. Прямые ссылки занимают лишь элемент каталога.
• Они добавляют лишние накладные расходы. Ядро должно больше работать для разрешения имени пути, содержащего символические ссылки.
• Они могут создать «циклы». Рассмотрите следующее:
$ rm -f a b /* Убедиться, что 'a' и 'b' не существуют */
$ ln -s a b /* Создать ссылку старого файла 'a' на новый 'b' */
$ ln -s b a /* Создать ссылку старого файла 'b' на новый 'a' */
$ cat а /* Что случилось? */
cat: a: Too many levels of symbolic links
Ядро должно быть способно определить такой случай и выдать сообщение об ошибке.
• Они легко обрываются. Если переместить указываемый файл в другое место или переименовать его, символическая ссылка больше не действительна. С прямой ссылкой такого случиться не может.
5.2. Создание и удаление каталогов
Создание и удаление каталогов просто. Двумя системными вызовами, что неудивительно, являются
mkdir
и
rmdir
соответственно:
#include <sys/types.h> /* POSIX */
#include <sys/stat.h>
int mkdir(const char *pathname, mode_t mode);
#include <unistd.h> /* POSIX */
int rmdir(const char *pathname);
Оба возвращают 0 при успехе и (-1) при ошибке, с соответствующим
errno
. Аргумент
mode
для
mkdir
представляет права доступа, которые должны быть использованы для каталога. Он полностью идентичен аргументам
mode
для
creat
и
open
, обсуждавшимся в разделе 4.6 «Создание файлов».
Обе функции обрабатывают '
.
' и '
..
' в создаваемом или удаляемом каталоге. Перед удалением каталог должен быть пуст; если это не так,
errno
устанавливается в
ENOTEMPTY
. (В данном случае, «пуст» означает, что каталог содержит только '
.
' и '
..
'.)
Новым каталогам, как и всем файлам, присваивается идентификационный номер группы. К сожалению, его работа запутана. Мы отложим обсуждение до раздела 11.5.1 «Группа по умолчанию для новых файлов и каталогов».
Обе функции работают на одном уровне каталога за раз. Если
/somedir
существует, a
/somedir/sub1
нет, '
mkdir("/somedir/sub1/sub2")
' завершится неудачей. Каждый компонент в длинном пути должен создаваться отдельно (в соответствии с опцией
– р mkdir
, см. mkdir(1)).
Также, если
pathname
завершается символом '
/
', на некоторых системах
mkdir
и
rmdir
потерпят неудачу, а на других нет. Следующая программа,
ch05-trymkdir.с
, демонстрирует оба аспекта.
1 /* ch05-trymkdir.c --- Демонстрирует поведение mkdir.