syscalls (1115160), страница 3
Текст из файла (страница 3)
Если такое поведениенежелательно, нужно использовать link.Возвращаемое значениеПри успешном завершении возвращается 0. При ошибке возвращается -1 и переменнаяerrno устанавливается в код ошибки.Коды ошибокEPERMEFAULTEACCESфайловая система не поддерживает создание жёстких связейoldpath или newpath указывают за пределы адресного пространства процессакаталог, содержащий newpath не допускает запись в него; либо один из каталогов в oldpath не допускает поиск11ENAMETOOLONGENOENTENOTDIRENOMEMEROFSEEXISTELOOPENOSPCEIO11слишком длинный путь oldpath или newpathкомпонента каталога в oldpath или newpath не существует, либо является«висящей» символической ссылкойкомпонента пути, заявленная в пути как каталог, на самом деле не являетсятаковымнедостаточно памяти ядрафайловая система работает в режиме «только чтение»newpath уже существуетслишком много символических связей было встречено при прослеживании пути newpath или oldpathна устройстве нет свободного места для новой записи в каталогеошибка ввода/вывода на устройствеreadlinkreadlink — считать значение символической связи.Использование#include <unistd.h>int readlink(const char *path, char *buf, size_t bufsiz);Описаниеreadlink помещает содержимое символической связи path в буфер buf, который имеет размер bufsiz.
readlink не добавляет символ ’\0’ в конец строки. Содержимое символической связи ограничивается bufsiz символами, если размер буфера недостаточен дляразмещения всей связи.Возвращаемое значениеСистемный вызов возвращает число символов, записанное в буфер в случае успешногозавершения. В случае ошибки возвращается -1 и переменная errno устанавливается в кодошибки.Коды ошибокENOTDIREINVALENAMETOOLONGENOENTEACCESELOOPEIOEFAULTENOMEMкомпонента пути, заявленная в пути как каталог, на самом деле не являетсятаковымbufsiz неположителен; либо path не является символической связьюслишком длинный путь pathкомпонента каталога в path не существует, либо является «висящей» символической ссылкой; символическая связь path не существуетодин из каталогов в path не допускает поискслишком много символических связей было встречено при прослеживании пути pathошибка ввода/вывода на устройствеpath или buf указывают за пределы адресного пространства процессанедостаточно памяти ядра1212unlinkunlink — уничтожить имя и, возможно, файл, на который оно указывает.Использование#include <unistd.h>int unlink(const char *pathname);Описаниеunlink уничтожает имя в файловой системе.
Если это имя было последним, котороессылалось на файл, и файл не был открыт никаким процессом, файл уничтожается и местона диске, которое он занимал, становится доступным для повторного использования.Если имя pathname было последней ссылкой на файл, но какие-либо процессы держат этот файл открытым, файл продолжает существование до момента, когда будет закрытпоследний файловый дескриптор, ссылающийся на файл.Если имя pathname является именем символической связи, уничтожается сама символическая связь, а не файл, на который она указывает.Возвращаемое значениеПри успешном завершении возвращается 0. В случае ошибки возвращается -1, и переменная errno устанавливается в код ошибки.Коды ошибокEFAULTEACCESEPERMENAMETOOLONGENOENTENOTDIREISDIRENOMEMEROFSELOOPEIO13path или buf указывают за пределы адресного пространства процессакаталог, содержащий pathname не допускает запись в него; либо один из каталогов не допускает поиску каталога, содержащего удаляемый файл, установлен бит t, и uid процессане совпадает с uid удаляемого файла или родительского каталога; pathnameявляется каталогомслишком длинный путь pathnameкомпонента каталога в pathname не существует, либо является «висящей»символической ссылкойкомпонента пути, заявленная в пути как каталог, на самом деле не являетсятаковымpathname является каталогомнедостаточно памяти ядраpathname находится в файловой системе, которая работает в режиме «толькочтение»слишком много символических связей было встречено при прослеживании пути pathошибка ввода/вывода на устройствеrenamerename — изменить имя или расположение файла.13Использование#include <stdio.h>int rename(const char *oldpath, const char *newpath);Описаниеrename переименовывает файл, перемещая его между каталогами, если необходимо.Другие жёсткие связи (созданные с помощью link) не затрагиваются.Если newpath уже существует, он будет атомарно заменён так, что для другого процесса,который работает с newpath, он всегда будет существовать.
Однако может существоватьпромежуток времени, в течение которого oldpath и newpath будут указывать на один итот же файл.Если newpath существует, но операция по какой-либо причине завершается неудачно,rename гарантирует, что newpath останется неизменным.Если oldpath является символической связью, связь переименовывается, а еслиnewpath является символической связью, она уничтожается.Возвращаемое значениеПри успешном завершении операции возвращается 0.
При ошибке возвращается -1, ипеременная errno устанавливается в код ошибки.Коды ошибокEISDIREXDEVENOTEMPTY, EEXISTEBUSYEINVALENOTDIREFAULTEACCESENAMETOOLONGENOENTENOMEMEROFSELOOPENOSPCnewpath существует и является каталогом, а oldpath не является каталогомoldpath и newpath не находятся на одной файловой системеnewpath — непустой каталог, то есть содержит записи, отличные от . и ..oldpath или newpath используются другим процессом или операционнойсистемой таким образом, что делает операцию невозможнойпопытка сделать каталог подкаталогом самого себякомпонента пути, заявленная в пути как каталог, на самом деле не являетсятаковым; либо oldpath является каталогом, а newpath существует и не является каталогомoldpath или newpath указывают за пределы адресного пространства процессазакрыт доступ на запись к необходимым каталогам; каталог в пути oldpathили newpath не позволяют вести поиск в нем; файловая система не допускаеттакую операциюслишком длинный путь oldpath или newpathкомпонента каталога существует, либо является «висящей» символическойссылкойнедостаточно памяти ядраpathname находится в файловой системе, которая работает в режиме «толькочтение»слишком много символических связей было встречено при прослеживании пути pathна устройстве не осталось места для новой записи в каталоге1414mkdirmkdir — создать каталог.Использование#include <sys/stat.h>#include <sys/types.h>#include <fcntl.h>#include <unistd.h>int mkdir(const char *pathname, mode_t mode);Описаниеmkdir создаёт новый каталог с именем pathname.mode задаёт права доступа к создаваемому каталогу.
Параметр mode модифицируетсязначением umask процесса стандартным способом (mode & ~umask).Вновь созданный каталог будет иметь такого владельца, каков euid процесса. Каталогунаследует идентификатор группы от родительского каталога.Возвращаемое значениеПри успешном завершении mkdir возвращает 0. При ошибке возвращается -1 и переменная errno устанавливается в код ошибки.Коды ошибокEEXISTEFAULTEACCESENAMETOOLONGENOENTENOTDIRENOMEMEROFSELOOPENOSPC15pathname уже существует (не обязательно каталог)pathname указывает за пределы адресного пространства процессакаталог, содержащий pathname не допускает запись в него; либо один из каталогов не допускает поискслишком длинный путь pathnameкомпонента каталога в pathname не существует, либо является «висящей»символической ссылкойкомпонента пути, заявленная в пути как каталог, на самом деле не являетсятаковымнедостаточно памяти ядраpathname находится в файловой системе, которая работает в режиме «толькочтение»слишком много символических связей было встречено при прослеживании пути pathна устройстве не осталось свободного места; либо исчерпана квота пользователяrmdirrmdir — удалить каталог.Использование15#include <unistd.h>int rmdir(const char *pathname);Описаниеrmdir удаляет каталог, который должен быть пустым.Возвращаемое значениеПри успешном завершении возвращается 0.
При ошибке возвращается -1, и переменнаяerrno устанавливается в код ошибки.Коды ошибокEPERMEFAULTEACCESENAMETOOLONGENOENTENOTDIRENOTEMPTYEBUSYENOMEMEROFSELOOP16файловая система не поддерживает удаление каталогов; у каталога, содержащего удаляемый файл, установлен бит t, и uid процесса не совпадает с uidудаляемого файла или родительского каталога;pathname указывает за пределы адресного пространства процессакаталог, содержащий pathname не допускает запись в него; либо один из каталогов не допускает поискслишком длинный путь pathnameкомпонента каталога в pathname не существует, либо является «висящей»символической ссылкойкомпонента пути, заявленная в пути как каталог, на самом деле не являетсятаковымкаталог содержит записи, отличные от .
и ..каталог является текущим или корневым каталогом некоторого процессанедостаточно памяти ядраpathname находится в файловой системе, которая работает в режиме «толькочтение»слишком много символических связей было встречено при прослеживании пути pathchdir, fchdirchdir, fchdir — сменить текущий каталог.Использование#include <unistd.h>int chdir(const char *path);int fchdir(int fd);Описаниеchdir устанавливает заданный параметром каталог path как текущий. fchdir устанавливает текущим каталог, заданный открытым файловым дескриптором.16Возвращаемое значениеПри успешном завершении возвращается 0. При ошибке возвращается -1, и переменнаяerrno устанавливается в код ошибки.Коды ошибокКоды ошибок зависят от файловой системы. Наиболее общие приведены ниже.EFAULTENAMETOOLONGENOENTENOMEMENOTDIREACCESELOOPEBADF17path указывает за пределы адресного пространства процессаслишком длинный путь pathкаталог path не существуетнедостаточно памяти ядракомпонента пути, заявленная в пути как каталог, на самом деле не являетсятаковымодин из каталогов-компонент пути не допускает поиск в немслишком много символических связей было встречено при прослеживании пути pathfd не является допустимым файловым дескрипторомgetcwdgetcwd — получить имя текущего каталога.Использование#include <unistd.h>char *getcwd(char *buf, size_t size);Описаниеgetcwd копирует абсолютное имя текущего рабочего каталога в массив, на который указывает buf, размера size.