Хотя технически это не системный вызов, возвращаемое значение в том же стиле: 0 в случае успеха и -1 при ошибке, причем errno
содержит значение ошибки.
В GNU/Linux remove()
использует для удаления файлов системный вызов unlink()
, а для удаления каталогов — системный вызов rmdir()
(обсуждаемый далее в главе). (На более старых системах GNU/Linux, не использующих GLIBC, remove()
является псевдонимом для unlink()
; поэтому для каталогов завершается неудачей. Если у вас такая система, вам, возможно, следует ее обновить.)
5.1.6. Символические ссылки
Мы начали главу с обсуждения разделов, файловых систем и индексов. Мы также увидели, что элементы каталога связывают имена с номерами индексов. Поскольку элементы каталога не содержат другой информации, прямые ссылки ограничены файлами
$ mount /* Показать использующиеся файловые системы */
/dev/hda2 on / type ext3 (rw)
/dev/hda5 on /d type ext3 (rw)
...
$ ls -li /tmp/message /* Предыдущий пример был в файловой системе / */
228786 -rw-r--r-- 2 arnold devel 19 May 4 15:51 /tmp/message
$ cat /tmp/message
Hi, how ya doin' ?
$ /bin/pwd /* Текущий каталог в другой файловой системе */
/d/home/arnold
$ ln /tmp/message . /* Попытка создать ссылку */
ln: creating hard link './message' to '/tmp/message': Invalid cross-device link
На больших системах часто много разделов как на физически подключенных локальных дисках, так и на удаленно смонтированных файловых системах. Ограничение прямых ссылок одной и той же файловой системой неудобно, например, если некоторые файлы или каталоги должны быть перемешены в новое место, но старое программное обеспечение использует жестко вшитые в код имена файлов для старых местоположений.
Чтобы обойти это ограничение, 4.2 BSD ввело
Символические ссылки могут ссылаться на любой файл в системе. Они могут также ссылаться на каталоги. Это упрощает перемещение каталогов с места на место, когда на старом месте остается символическая ссылка, указывающая на новое положение.
При обработке имени файла система отмечает символические ссылки и осуществляет требуемые действия в файле или каталоге, который указан. Символические ссылки создаются с помощью опции -s
команды ln
:
$ /bin/pwd /* Где мы находимся */
/d/home/arnold /* В другой файловой системе */
$ ln -s /tmp/message ./hello /* Создать символическую ссылку */
$ cat hello /* Использовать ее */
Hi, how ya doin' ?
$ ls -l hello /* Отобразить информацию о ней */
lrwxrwxrwx 1 arnold devel 12 May 4 16:41 hello -> /tmp/message
Файл, на который указывает ссылка, необязательно должен существовать. Система обнаруживает это во время исполнения и действует соответствующим образом:
$ rm /tmp/message /* Удалить указываемый файл */
$ 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