syscalls (1115160), страница 2
Текст из файла (страница 2)
При ошибке возвращается значение (off_t) -1, ипеременная errno устанавливается в код ошибки.6Коды ошибокEBADFEINVALESPIPEfildes — неверный файловый дескриптор.whence имеет недопустимое значение.fildes ассоциирован с каналом, сокетом или FIFO.ОграниченияНе все устройства (например терминалы), поддерживают операцию lseek. Поведениеlseek в этом случае неопределено.7stat, fstat, lstatstat, fstat, lstat — получить информацию о файле.Использование#include <sys/stat.h>#include <unistd.h>int stat(const char *file_name, struct stat *buf);int fstat(int filedes, struct stat *buf);int lstat(const char *file_name, struct stat *buf);ОписаниеЭти системные вызовы возвращают информацию о заданных файлах. Для получения информации о файле достаточно иметь права поиска на все каталоги, указанные в пути к файлу.stat возвращает информацию о файле с путём file_name и заполняет структуру buf.lstat идентичен stat, кроме того, что если указанное имя является символическойссылкой, возвращается информация о самой символической ссылке, а не о файле, на который она указывает.fstat идентичен stat, кроме того, что возвращается информация о файле по файловому дескриптору filedes, открытому, например, с помощью open.Системные вызовы заполняют структуру stat, содержащую следующие поля.struct stat{dev_tino_tmode_tnlink_tuid_tgid_tdev_toff_tunsigned longunsigned longtime_ttime_ttime_t};st_dev;st_ino;st_mode;st_nlink;st_uid;st_gid;st_rdev;st_size;st_blksize;st_blocks;st_atime;st_mtime;st_ctime;/*/*/*/*/*/*/*/*/*/*/*/*/*устройство */индексный дескриптор (inode) */права доступа и флаги */число ссылок */идентификатор владельца */идентификатор группы */тип устройства */размер в байтах */эффективный размер блока */число занятых блоков */время последнего доступа */время последней модификации */время последнего изменения inode */7Поле st_blocks даёт размер файла в блоках по 512 байт.
Поле st_blksize даётпредпочтительный размер блока для эффективных операций ввода-вывода с файловой системой.Для проверки типа файла определены следующие макросы:S_ISLNK(m)символическая ссылка?S_ISREG(m)обычный файл?S_ISDIR(m)каталог?S_ISCHR(m)устройство символьного типа?S_ISBLK(m)устройство блочного типа?S_ISFIFO(m) fifo?S_ISSOCK(m) сокет?Для поля st_mode определены следующие флаги:S_IFMTS_IFSOCKS_IFLNKS_IFREGS_IFBLKS_IFDIRS_IFCHRS_IFIFOS_ISUIDS_ISGIDS_ISVTXS_IRWXUS_IRUSRS_IWUSRS_IXUSRS_IRWXGS_IRGRPS_IWGRPS_IXGRPS_IRWXOS_IROTHS_IWOTHS_IXOTH01700000140000012000001000000060000004000000200000010000000400000020000001000007000040000200001000007000040000200001000007000040000200001битовая маска для поля типа файласокетсимволическая ссылкаобычный файлустройство блочного типакаталогустройство символьного типаfifoбит suidбит sgidsticky bitмаска для прав доступа владельцавладелец имеет права чтениявладелец имеет права записивладелец имеет права выполнениямаска для прав доступа группыгруппа имеет права чтениягруппа имеет права записигруппа имеет права выполнениямаска для прав доступа прочих пользователейпрочие имеют права чтенияпрочие имеют права записипрочие имеют права выполненияБит sgid имеет несколько назначений: для каталогов он указывает, что в данном каталогеиспользуется семантика создания файлов BSD, то есть файлы, создаваемые в этом каталоге,наследуют идентификатор группы от каталога, а не от идентификатора группы процесса, создающего файл, каталоги созданные в этом каталоге также будут иметь установленный битsgid.‘sticky’ bit (S_ISVTX) на каталоге означает, что файл в данном каталоге может быть переименован или удалён только владельцем файла, владельцем каталога или суперпользователем (root).Возвращаемое значениеПри успешном завершении возвращается 0.
При ошибке возвращается -1, и переменнаяerrno устанавливается в код ошибки.8Коды ошибокEBADFENOENTENOTDIRELOOPEFAULTEACCESENOMEMENAMETOOLONG8неверный файловый дескриптор filedes.компонента имени каталога в пути не существует, либо висячая символическаяссылка.компонента пути, используемая как каталог, не является каталогом.слишком много символических ссылок при трансляции пути.file_name представляет собой недопустимый адрес.один из каталогов в пути к файлу не позволяет поиск в нем.недостаточно памяти для ядра.путь слишком длинный.accessaccess — проверить права доступа пользователя к файлу.Использование#include <unistd.h>int access(const char *pathname, int mode);Описаниеaccess проверяет, имеет ли процесс права на чтение или запись, либо существует лифайл, путь к которому указан в pathname.
Если pathname — символическая ссылка, проверяются права доступа к файлу, на который указывает эта символическая ссылка.mode — это маска, состоящая из одного или более флагов R_OK, W_OK, X_OK и F_OK.R_OK, W_OK и X_OK запрашивают проверку на существование файла и права на чтение,запись и выполнение соответственно. F_OK запрашивает проверку на существование файла.Результат проверки зависит от прав доступа к каталогам, указанным в пути к файлу, и отправ доступа к каталогам и файлам, на которые ссылаются символические ссылки, использованные при разборе пути к файлу.Проверки производятся с реальным идентификатором пользователя и группы процесса,а не с эффективными идентификаторами, в отличие от команд доступа к файлам.
Это позволяет программам с битом suid проверять полномочия вызвавшего её пользователя.Проверяются только биты доступа, но не содержимое файлов, то есть если каталог обнаружен как доступный на запись, это может означать, что в этом каталоге могут создаватьсяфайлы, а не то, что каталог может быть записан как файл.Возвращаемое значениеПри успешном завершении (все запрошенные права могут быть предоставлены) возвращается 0. При ошибке (хотя бы одно из запрошенных прав не предоставлено, или в случаедругой ошибки) возвращается -1, и errno устанавливается в код ошибки.Коды ошибокEACCESзапрошенный режим доступа не разрешён, либо один из каталогов в пути кфайлу не позволяет поиск в нем.9EROFSEFAULTEINVALENAMETOOLONGENOENTENOTDIRENOMEMELOOPEIO9путь указывает на файл на файловой системе, доступной только на чтение, ирежим записи был запрошен.pathname представляет собой недопустимый адрес.mode задан некорректно.путь слишком длинный.компонента имени каталога в пути не существует, либо висячая символическаяссылка.компонента пути, используемая как каталог, не является каталогом.недостаточно памяти для ядра.слишком много символических ссылок при трансляции пути.ошибка ввода/вывода.linklink — создать новое имя для файла.Использование#include <unistd.h>int link(const char *oldpath, const char *newpath);Описаниеlink создаёт новую связь (жёсткую связь) на существующий файл.
Если имя newpathсуществует, оно переписывается.Вновь созданное имя может использоваться для любой операции точно так же, как истарое. Оба имени ссылаются на тот же самый файл (имеют одинаковых владельцев и правадоступа), после создания жёсткой связи невозможно отличить, какое имя было «оригинальным».Жёсткие связи не могут пересекать границы файловых систем.
Если это необходимо, используйте symlink.Возвращаемое значениеПри успешном завершении возвращается 0. При ошибке возвращается -1, и переменнаяerrno устанавливается в код ошибки.Коды ошибокEXDEVEPERMEFAULTEACCESENAMETOOLONGENOENTENOTDIRoldpath и newpath не располагаются на одной файловой системефайловая система не поддерживает создание жёстких связей; либо oldpathявляется каталогомoldpath или newpath указывают за пределы адресного пространства процессакаталог, содержащий newpath не допускает запись в него; либо один из каталогов в oldpath не допускает поискслишком длинный путь oldpath или newpathкомпонента каталога в oldpath или newpath не существует, либо является«висящей» символической ссылкойкомпонента пути, заявленная в пути как каталог, на самом деле не являетсятаковым10ENOMEMEROFSEMLINKELOOPENOSPCEIO10недостаточно памяти ядрафайловая система работает в режиме «только чтение»файл, на который указывает oldpath, уже имеет слишком много жёсткихсвязейслишком много символических связей было встречено при прослеживании пути newpath или oldpathна устройстве нет свободного места для новой записи в каталогеошибка ввода/вывода на устройствеsymlinksymlink — создать новое имя для файла.Использование#include <unistd.h>int symlink(const char *oldpath, const char *newpath);Описаниеsymlink создаёт символическую связь с именем newpath, которая содержит строкуoldpath.Символические связи интерпретируются во время выполнения как если бы содержимоессылки было подставлено в прослеживаемый путь для поиска файла или каталога.Символические связи могут содержать компоненту пути .., которая (если использованав начале строки связи), обозначает родительский каталог того каталога, в котором находитсясимволическая связь.Символическая связь может указывать на существующий файл или каталог, а может —на несуществующий.
Последний случай ещё называется «висячей ссылкой».Права доступа у символической связи игнорируются, когда символическая связь прослеживается, но проверяются при переименовании или удалении в каталогах с установленнымбитом t.Если newpath существует, он не переписывается. oldpath не проверяется на допустимость.Удаление имени, на который указывает символическая связь, ведёт к действительномуудалению файла (если только этот файл не имел ещё жёстких связей).