Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

$ 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 <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.

2 Любезность Nelson H.F. Beebe. */

3

4 #include <stdio.h>

5 #include <stdlib.h>

6 #include <errno.h>

7

8 #if !defined(EXIT_SUCCESS)

9 #define EXIT_SUCCESS 0

10 #endif

11

12 void do_test(const char *path)

13 {

14 int retcode;

15

16 errno = 0;

17 retcode = mkdir(path, 0755);

18 printf("mkdir(\"%s\") returns %d: errno = %d [%s)\n",

19 path, retcode, errno, strerror(errno));

20 }

21

22 int main(void)

23 {

24 do_test("/tmp/t1/t2/t3/t4"); /*Попытка создания в подкаталоге*/

25 do_test("/tmp/t1/t2/t3");

26 do_test("/tmp/t1/t2");

27 do_test("/tmp/t1");

28

29 do_test("/tmp/u1"); /* Создать подкаталоги */

30 do_test("/tmp/u1/u2");

Поделиться:
Популярные книги

Железный Воин Империи II

Зот Бакалавр
2. Железный Воин Империи
Фантастика:
фэнтези
попаданцы
аниме
5.75
рейтинг книги
Железный Воин Империи II

Дважды одаренный. Том VIII

Тарс Элиан
8. Дважды одаренный
Фантастика:
боевая фантастика
альтернативная история
аниме
попаданцы
5.00
рейтинг книги
Дважды одаренный. Том VIII

Гримуар тёмного лорда I

Грехов Тимофей
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар тёмного лорда I

Эпоха Опустошителя. Том VII

Павлов Вел
7. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том VII

Газлайтер. Том 6

Володин Григорий
6. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 6

Тринадцатый XI

NikL
11. Видящий смерть
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Тринадцатый XI

Первый среди равных. Книга II

Бор Жорж
2. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга II

Последний Герой. Том 4

Дамиров Рафаэль
Последний герой
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Последний Герой. Том 4

Изменяющий-Механик. Компиляция. Книги 1-18

Усманов Хайдарали
Собрание сочинений
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Изменяющий-Механик. Компиляция. Книги 1-18

Точка Бифуркации V

Смит Дейлор
5. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Точка Бифуркации V

Вагант

Листратов Валерий
6. Ушедший Род
Фантастика:
боевая фантастика
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Вагант

Личник

Валериев Игорь
3. Ермак
Фантастика:
альтернативная история
6.33
рейтинг книги
Личник

Наномашины, сынок! Том 1

Новиков Николай Васильевич
1. Чего смотришь? Иди книгу читай
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наномашины, сынок! Том 1

Последний Паладин. Том 6

Саваровский Роман
6. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 6