UNLINK(2)

ИМЯ
unlink, unlinkat - удаляет имя и, возможно, файл, на который оно ссылается

ОБЗОР
#include <unistd.h>

int unlink(const char *pathname);
#include <fcntl.h>           /* определения констант of AT_* */
#include <unistd.h>

int unlinkat(int dirfd, const char *pathname, int flags);

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

unlinkat():
    Начиная с glibc 2.10:
        _POSIX_C_SOURCE >= 200809L
    До glibc 2.10:
        _ATFILE_SOURCE

ОПИСАНИЕ
unlink() удаляет имя из файловой системы. Если это имя было последней ссылкой на файл и больше нет процессов, которые держат этот файл открытым, данный файл удаляется и место, которое он занимает, освобождается для дальнейшего использования.

Если имя было последней ссылкой на файл, но какие-либо процессы всё ещё держат этот файл открытым, файл будет оставлен, пока последний файловый дескриптор, указывающий на него, не будет закрыт.

Если имя указывает на символьную ссылку, то будет удалена ссылка.

Если имя указывает на сокет, FIFO или устройство, то имя будет удалено, но процессы, которые открыли любой из этих объектов могут продолжать его использовать.

  unlinkat()
Системный вызов unlinkat() работает также как unlink() или rmdir(2) (в зависимости от того, есть ли флаг AT_REMOVEDIR во flags), за исключением случаев, описанных здесь.

Если в pathname задан относительный путь, то он считается относительно каталога, на который ссылается файловый дескриптор dirfd (а не относительно текущего рабочего каталога вызывающего процесса, как это делается в unlink() и rmdir(2)).

Если в pathname задан относительный путь и dirfd равно специальному значению AT_FDCWD, то pathname рассматривается относительно текущего рабочего каталога вызывающего процесса (как unlink() и rmdir(2)).

Если в pathname задан абсолютный путь, то dirfd игнорируется.

Аргумент flags представляет собой битовую маску, значение которой может быть 0, или объединённым значением флагов с помощью OR, определяющих операцию unlinkat(). В настоящее время определён только один флаг:

AT_REMOVEDIR
    По умолчанию, unlinkat() выполняет действие, эквивалентное unlink() с параметром pathname. Если указан флаг AT_REMOVEDIR, то выполняется действие, эквивалентное rmdir(2) с параметром pathname.

Смотрите в openat(2) объяснение необходимости unlinkat().

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

EACCES
    Для эффективного UID процесса нет прав на запись в каталог, содержащийся в pathname, или в одном из каталогов в pathname не разрешён поиск (смотрите также path_resolution(7)).

EBUSY
    Файл pathname не может быть удалён, так как он ещё используется системой или другим процессом; например, это точка монтирования или его создал клиент NFS для представления активной, но пока безымянной inode («NFS silly renamed»).

EFAULT
    Аргумент pathname указывает за пределы доступного адресного пространства.

EIO Произошла ошибка ввода-вывода.

EISDIR
    pathname ссылается на каталог. (Этого значения нет в POSIX, возвращается в Linux начиная с 2.1.132.)

ELOOP
    Во время определения pathname встретилось слишком много символьных ссылок.

ENAMETOOLONG
    pathname слишком длинен.

ENOENT
    Компонент pathname не существует, является повисшей ссылкой или pathname пуст.

ENOMEM
    Недостаточное количество памяти ядра.

ENOTDIR
    Компонент пути, использованный как каталог в pathname, в действительности таковым не является.

EPERM
    Система не разрешает удаление каталогов или для удаления каталогов требуются права, которыми не обладает вызвавший процесс. (Этот код ошибки предусмотрен в POSIX; как описано выше, в Linux в этом случае возвращается EISDIR.)

EPERM (только в Linux)
    Файловая система не позволяет удаление файлов.

EPERM или EACCES
    На каталоге, содержащемся в pathname, установлен закрепляющий бит (S_ISVTX) и эффективный UID процесса не совпадает ни с UID удаляемого файла, ни с каталогом, в котором он содержится, и у процесса нет прав (Linux: нет мандата CAP_FOWNER).

EPERM
    Файл для удаления помечен как неизменяемый (immutable) или только для добавления (смотрите ioctl_iflags(2)).

EROFS
    pathname указывает на файл в файловой системе, доступной только для чтения.

В unlinkat() могут возникнуть те же ошибки, что и в unlink() и rmdir(2). Также, в unlinkat() могут возникнуть следующие ошибки:

EBADF
    dirfd не является правильным файловым дескриптором.

EINVAL
    В flags указано неверное значение флага.

EISDIR
    Значение pathname ссылается на каталог и в flags не указан AT_REMOVEDIR.

ENOTDIR
    Значение pathname содержит относительный путь и dirfd содержит файловый дескриптор, указывающий на файл, а не на каталог.

ВЕРСИИ
Системный вызов unlinkat() был добавлен в ядро Linux версии 2.6.16; поддержка в glibc доступна с версии 2.4.

СООТВЕТСТВИЕ СТАНДАРТАМ
unlink(): SVr4, 4.3BSD, POSIX.1-2001, POSIX.1-2008.

unlinkat(): POSIX.1-2008.

ЗАМЕЧАНИЯ

  Замечания по glibc
В старых ядрах, где unlinkat() отсутствует, обёрточная функция glibc использует unlink(2) или rmdir(2). Если pathname является относительным путём, то glibc собирает путь относительно символической ссылки в /proc/self/fd, которая соответствует аргументу dirfd.

ДЕФЕКТЫ
Неточности в протоколе NFS могут приводить к неожиданному исчезновению файлов, которые всё ещё используются.

СМОТРИТЕ ТАКЖЕ
rm(1), unlink(1), chmod(2), link(2), mknod(2), open(2), rename(2), rmdir(2), mkfifo(3), remove(3), path_resolution(7), symlink(7)