syscalls (1115160), страница 4
Текст из файла (страница 4)
Если имя текущего каталога требует буфера размера большего,чем size, возвращается NULL и errno устанавливается в ERANGE.Возвращаемое значениеПри успешном завершении возвращается buf. При ошибке возвращается NULL, и переменная errno устанавливается в код ошибки.18opendiropendir — открыть каталог на чтение.Использование#include <sys/types.h>#include <dirent.h>DIR *opendir(const char *name);17ОписаниеФункция opendir открывает каталог с заданным именем и возвращает указатель наструктуру DIR, используемую для доступа к элементам каталога.
Указатель текущего положения позиционируется на начало файла.Возвращаемое значениеУказатель на структуру DIR при успешном завершении, или NULL при ошибке, тогдаerrno устанавливается в код ошибки.Коды ошибокEACCESEMFILEENFILEENOENTENOMEMENOTDIR19каталог закрыт на чтение, либо один из каталогов в пути к файлу не позволяет поискв нем.процесс уже открыл максимальное количество файлов.достигнут лимит на число открытых файлов в системе.компонента имени каталога в пути не существует, либо висячая символическаяссылка, либо пустое имя каталога.недостаточно памяти для ядра.компонента пути, используемая как каталог, не является каталогом.readdirreaddir — читать из каталога.Использование#include <sys/types.h>#include <dirent.h>struct dirent *readdir(DIR *dir);ОписаниеФункция readdir возвращает указатель на структуру dirent, которая содержит информацию о следующей записи в каталоге, доступ к которому производится по указателюdir. Функция возвращает NULL при ошибке или конце каталога.Данные, возвращённые readdir, будут переписаны последующими вызовами readdirс тем же указателем dir.Структура struct dirent содержит поле char d_name[], в котором хранится текущее имя в каталоге, заканчивающееся нулевым символом.
Структура может содержатьполе ino_t d_ino, хранящее номер индексного дескриптора, но пользоваться им нельзя,поскольку оно хранит неправильное значение в точках монтирования.Возвращаемое значениеПри успешном завершении readdir возвращает указатель на структуру dirent. В случае ошибки или конца файла возвращается NULL.18Коды ошибокEBADF неверный указатель dir.20telldirtelldir — получить текущую позицию чтения в каталоге.Использование#include <dirent.h>off_t telldir(DIR *dir);ОписаниеФункция telldir возвращает текущую позицию в потоке чтения каталога dir.Возвращаемое значениеПри успешном завершении возвращается текущая позиция в потоке чтения каталога.При ошибке возвращается -1, и переменная errno устанавливается в код ошибки.Коды ошибокEBADF21Неверный дескриптор потока каталога dir.seekdirseekdir — установить позицию чтения из каталога для последующего вызоваreaddir.Использование#include <dirent.h>void seekdir(DIR *dir, off_t offset);ОписаниеФункция seekdir устанавливает положение указателя чтения из дескриптора каталогаdir.
Следующий вызов readdir считает очередную запись, начиная с установленной позиции. Значение offset должно быть получено вызовом telldir или быть равным 0.Возвращаемое значениеФункция не возвращает значения.22closedirclosedir — закрыть каталог.19Использование#include <sys/types.h>#include <dirent.h>int closedir(DIR *dir);ОписаниеФункция closedir закрывает каталог, ассоциированный с dir. Этот указатель dirпосле закрытия использовать нельзя.Возвращаемое значениеПри успешном завершении возвращается 0, в случае ошибки возвращается -1.Коды ошибокEBADF неверный указатель dir.23chmod, fchmodchmod, fchmod — изменить права доступа к файлу.Использование#include <sys/types.h>#include <sys/stat.h>int chmod(const char *path, mode_t mode);int fchmod(int fildes, mode_t mode);ОписаниеСистемные вызовы изменяют права доступа к файлу по заданному пути или файлу, накоторый ссылается открытый файловый дескриптор.Права доступа определяются побитовым объединением следующих флагов.S_ISUIDS_ISGIDS_ISVTXS_IRUSR (S_IREAD)S_IWUSR (S_IWRITE)S_IXUSR (S_IEXEC)S_IRGRPS_IWGRPS_IXGRPS_IROTHS_IWOTHS_IXOTH040000200001000004000020000100000400002000010000040000200001setuid битsetgid бит‘sticky’ битчтение владельцемзапись владельцемвыполнение/поиск владельцемчтение группойзапись группойвыполнение/поиск группойчтение остальнымизапись остальнымивыполнение/поиск остальнымиЭффективный идентификатор процесса должен быть нулевым или совпадать с идентификатором владельца файла.В файловой системе NFS ограничение прав доступа немедленно повлияет на уже откры20тые файлы, потому что контроль доступа производится сервером, а открытые файлы поддерживаются клиентом.
Расширение прав доступа может быть отложено для клиентов, у которых включено кеширование атрибутов.Возвращаемое значениеВ случае успешного завершения возвращается 0. При ошибке возвращается -1 и переменная errno устанавливается в код ошибки.Коды ошибокВ зависимости от файловой системы могут возвращаться другие ошибки. Наиболее общие ошибки приведены ниже.EPERMEROFSEFAULTENAMETOOLONGENOENTENOMEMENOTDIREACCESELOOPEIOEBADF24Эффективный идентификатор процесса не совпадает с идентификатором владельца файла и не равен 0.Указанный файл находится на файловой системе, доступной только на чтение.path — неверный адрес.path слишком длинный.Файл не существует.Недостаточно памяти ядра, чтобы выполнить операцию.Компонент пути не является каталогом.Компонент пути не допускает поиск в нем.Слишком много символических ссылок.Ошибка ввода/вывода.Недопустимый файловый дескриптор fildes.utimeutime — изменить времена последнего доступа и/или модификации индексного дескриптора.Использование#include <sys/types.h>#include <utime.h>int utime(const char *filename, struct utimbuf *buf);Описаниеutime изменяет времена доступа и модификации индексного дескриптора, заданного спомощью filename, на значения полей actime и modtime соответственно.
Если bufравен NULL, время доступа и модификации устанавливается в текущее время. Структураutimbuf определена следующим образом.struct utimbuf {time_t actime; /* access time */time_t modtime; /* modification time */};21Возвращаемое значениеВ случае успешного выполнения возвращается 0. При ошибке возвращается -1, и переменная errno устанавливается в код ошибки.Коды ошибокМогут возвращаться другие коды ошибок.EACCES Нет прав записи в файл.ENOENT Файл filename не существует.25umaskumask — установить маску создания файлов.Использование#include <sys/types.h>#include <sys/stat.h>mode_t umask(mode_t mask);Описаниеumask устанавливает маску создания файлов umask в значение mask & 0777.Значение umask используется системными вызовами open(2), creat(2), mkdir(2) дляустановки прав доступа ко вновь создаваемому файлу. Более точно, права доступа, установленные в umask, сбрасываются в аргументе mode системного вызова open(2).
Если, например, значение umask равно 022 (часто используемое значение по умолчанию), а новыйфайл создаётся с правами 0666, файл будет создан с правами 0666 & ~022 = 0644 =rw-r--r--.Возвращаемое значениеСистемный вызов всегда завершается успешно и возвращает предыдущее значение маски создания файлов.26truncate, ftruncatetruncate, ftruncate — обрезать файл на заданную длину.Использование#include <unistd.h>int truncate(const char *path, off_t length);int ftruncate(int fd, off_t length);22ОписаниеЭти системные вызовы обрезают файл, именованный с помощью path, или на которыйссылается fd до длины length. Если файл был изначально короче, его длина не изменяется. Если файл был длиннее, остаток файла теряется.
При использовании ftruncate файлдолжен быть открыт на запись.Возвращаемое значениеВ случае успешного завершения возвращается 0. При ошибке возвращается -1 и переменная errno устанавливается в код ошибки.Коды ошибокENOTDIRENAMETOOLONGENOENTEACCESEACCESEISDIRELOOPEIOEROFSEFAULTEBADFEINVALETXTBSYКомпонент пути не является каталогом.path слишком длинный.Файл не существует.Компонент пути не допускает поиск в нем.Указанный файл недоступен на запись.Указанный файл является каталогом.Слишком много символических ссылок.Ошибка ввода/вывода.Указанный файл находится на файловой системе, доступной только на чтение.path — неверный адрес.Недопустимый файловый дескриптор fd.Файловый дескриптор fd ссылается не на файл, или файл не открыт на запись.Данный файл является программой, которая в данный момент исполняется.23.