说明

unlink()从文件系统中删除一个名称。如果该名称是指向文件的最后一个链接,并且没有进程打开该文件,则该文件将被删除,并且其正在使用的空间可供重新使用。

如果名称是指向文件的最后一个链接,但是任何进程仍在打开该文件,则该文件将一直存在,直到关闭引用该文件的最后一个文件描述符为止。

如果名称引用了符号链接,则该链接将被删除。

如果该名称涉及套接字,FIFO或设备,则将其名称删除,但是打开对象的进程可能会继续使用它。

unlinkat()

除了此处描述的差异外,unlinkat()系统调用的操作方式与unlink()或rmdir(2)完全相同(取决于标志是否包括AT_REMOVEDIR标志)。

如果在路径名中给定的路径名​​是相对的,那么它将相对于文件描述符dirfd所引用的目录进行解释(而不是相对于调用进程的当前工作目录,如unlink()和rmdir(2)所做的那样)相对路径名)。

如果在路径名中给定的路径名​​是相对的并且dirfd是特殊值AT_FDCWD,则将相对于调用进程的当前工作目录(例如unlink()和rmdir(2))来解释路径名。

如果在路径名中给定的路径名​​是绝对的,则dirfd被忽略。

flags是一个位掩码,可以将其指定为0,也可以将控制unlinkat()操作的标志值进行或运算。当前,仅定义了一个这样的标志:

AT_REMOVEDIR
默认情况下,unlinkat()对路径名执行unlink()的等效功能。如果指定了AT_REMOVEDIR标志,则在路径名上执行与rmdir(2)等效的操作。

有关对unlinkat()的需求的说明,请参见openat(2)。

备注

Glibc notes

在无法使用unlinkat()的旧内核上,glibc包装器功能会退回到使用unlink()或rmdir(2)。如果路径名是相对路径名,则glibc将基于/ proc / self / fd中与dirfd参数相对应的符号链接构造路径名。

另外参见

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)

语法

#include <unistd.h>

int unlink(const char *pathname);

#include <fcntl.h>           /* Definition of AT_* constants */
#include <unistd.h>

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

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

unlinkat():

Since glibc 2.10:
_POSIX_C_SOURCE>= 200809L
Before glibc 2.10:
_ATFILE_SOURCE

返回值

成功时,返回零。如果出错,则返回-1,并正确设置errno。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

BUGS

NFS底层协议的不足会导致仍在使用的文件意外消失。

版本

unlinkat()已在内核2.6.16中添加到Linux;库支持已添加到版本2.4中的glibc。

UNLINK - Linux手册页

Linux程序员手册 第2部分
更新日期: 2017-09-15

遵循规范

unlink():SVr4、4.3BSD,POSIX.1-2001,POSIX.1-2008。

unlinkat():POSIX.1-2008。

名称

unlink, unlinkat-删除名称以及它所引用的文件

错误说明

EACCES
进程的有效UID不允许对包含路径名的目录进行写访问,或者路径名中的目录之一不允许搜索权限。 (另请参见path_resolution(7)。)
EBUSY
无法取消链接文件路径名,因为它正在被系统或其他进程使用;例如,它是一个挂载点,或者NFS客户端软件创建了它来表示一个活动但无名的inode(" NFS傻重命名")。
EFAULT
路径名指向您可访问的地址空间之外。
EIO
发生I / O错误。
EISDIR
路径名是指目录。 (这是Linux从2.1.132开始返回的非POSIX值。)
ELOOP
在翻译路径名时遇到太多符号链接。
ENAMETOOLONG
路径名太长。
ENOENT
路径名中的组件不存在或悬挂的符号链接,或者路径名为空。
ENOMEM
内核内存不足。
ENOTDIR
实际上,在路径名中用作目录的组件不是目录。
EPERM
系统不允许目录的取消链接,或者目录的取消链接需要调用进程所没有的特权。 (这是POSIX规定的错误返回;如上所述,在这种情况下,Linux返回EISDIR。)
EPERM(Linux only)
文件系统不允许取消链接文件。
EPERMor EACCES
包含路径名的目录设置了粘滞位(S_ISVTX),并且进程的有效UID既不是要删除文件的UID,也不是包含该目录的目录的UID,并且该进程没有特权(Linux:不具有CAP_FOWNER功能)。
EPERM
要取消链接的文件被标记为不可变或仅附加。 (请参阅ioctl_iflags(2)。)
EROFS
路径名是指只读文件系统上的文件。

对于unlink()和rmdir(2),也会发生相同的错误。 unlinkat()可能会发生以下其他错误:

EBADF
dirfd不是有效的文件描述符。
EINVAL
在标志中指定了无效的标志值。
EISDIR
路径名引用目录,并且未在标志中指定AT_REMOVEDIR。
ENOTDIR
pathname是相对的,dirfd是引用目录以外的文件的文件描述符。
日期:2019-08-20 17:59:36 来源:oir作者:oir