UNLINK - Linux手册页
Linux程序员手册 第2部分
更新日期: 2017-09-15
名称
unlink, unlinkat-删除名称以及它所引用的文件
语法
#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
说明
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)。
返回值
成功时,返回零。如果出错,则返回-1,并正确设置errno。
错误说明
- 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是引用目录以外的文件的文件描述符。
版本
unlinkat()已在内核2.6.16中添加到Linux;库支持已添加到版本2.4中的glibc。
遵循规范
unlink():SVr4、4.3BSD,POSIX.1-2001,POSIX.1-2008。
unlinkat():POSIX.1-2008。
备注
Glibc notes
在无法使用unlinkat()的旧内核上,glibc包装器功能会退回到使用unlink()或rmdir(2)。如果路径名是相对路径名,则glibc将基于/ proc / self / fd中与dirfd参数相对应的符号链接构造路径名。
BUGS
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)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。