Листинг 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);