Программирование в стандарте POSIX


Создание, удаление, копирование и перемещение файлов - часть 2


Листинг 4.32. Пример программы, использующей функции creat() и perror().

CREAT failed: Too many open files errno = 24 Неудача на файле номер 1022

Листинг 4.33. Возможный результат первого выполнения программы, использующей функции creat() и perror().

Результат второго запуска той же программы показан в пример 4.34.

CREAT failed: Permission denied errno = 22 Неудача на файле номер 1

Листинг 4.34. Результат повторного выполнения программы, использующей функции creat() и perror().

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

Перечислим несколько других условий, способных привести к неудачному завершению вызова creat(): компонент маршрутного имени не существует или не является каталогом; у компонента маршрута отсутствует право на поиск; создание файла требует записи в каталог, права на запись в который нет; файл существует и является каталогом.

Рассмотренный в примере стиль уведомления о неудачном завершении общий для большинства функций. Неудача определяется возвращением результата, невозможного в другом случае (почти всегда это -1 или пустой указатель NULL); код ошибки заносится в переменную errno. Разумеется, в реальных программах errno не выводят, а анализируют. В данном случае уместно было бы сравнивать errno с константами EACCES, EINVAL, EMFILE и т.д. (см. <errno.h>).

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

df = creat ("/tmp/sample", S_IRWXU | S_IRWXG | S_IRWXO);

Листинг 4.35. Пример вызова функции creat().

Для создания (пустых) каталогов служит утилита

mkdir [-p] [-m режим_доступа] каталог ...

и функция mkdir()

#include <sys/stat.h> int mkdir (const char *path, mode_t mode);




Начало  Назад  Вперед



Книжный магазин