unlink 或 unlinkat 子例程
用途
除去目录条目。
库
标准 C 库 (libc.a)
语法
#include <unistd.h>
int unlink (Path)
const char *Path;
int unlinkat (DirFileDescriptor,
Path, Flag)
int DirFileDescriptor;
const char * Path;
int Flag;描述
unlink 和 unlinkat 子例程除去由 Path 参数指定的目录条目,并减少该链接引用的文件的链接计数。 如果系统上安装了网络文件系统 (NFS) ,那么此路径可以跨入另一个节点。
AT_REMOVEDIR的 unlinkat 子例程来除去空目录。当除去到文件的所有链接并且没有进程打开该文件时,将回收与该文件相关联的所有资源,并且该文件不再可访问。 如果一个或多个进程在除去最后一个链接时打开文件,那么目录条目将消失。 但是,将延迟除去文件内容,直到所有对文件的引用都关闭为止。
如果 Path 的父目录具有 粘性 属性 (在 mode.h 文件中描述) ,那么调用进程必须具有 root 用户权限或等于 Path 的所有者标识或 Path的父目录的所有者标识的有效用户标识。
如果 unlink 或 unlinkat 子例程成功,那么会将父目录的 st_ctime 和 st_mtime 字段标记为更新。 此外,如果文件的链接计数不是 0 ,那么将标记该文件的 st_ctime 字段以进行更新。
应用程序应该使用 rmdir 子例程或带有 AT_REMOVEDIR 位的 Flag 参数的 unlinkat 子例程来除去目录。 如果 路径 参数指定符号链接,那么会除去该链接本身。
如果Flag参数没有设置 "AT_REMOVEDIR位,且DirFileDescriptor为 "AT_FDCWD或Path为绝对路径名,则 "unlinkat子程序等同于 "unlink子程序。 如果DirFileDescriptor是打开目录的有效文件描述符,且Path是相对路径名,则Path将被视为相对于与DirFileDescriptor参数关联的目录,而不是当前工作目录。
如果 "unlinkat子程序中的DirFileDescriptor在未使用 "O_SEARCH打开标记的情况下打开,则该子程序会使用目录的当前权限来检查是否允许对该目录进行目录搜索。 如果该目录是使用 O_SEARCH open 标志打开的,那么子例程不会对该目录执行检查。
如果 unlinkat 子例程的 Flag 参数设置了 AT_REMOVEDIR 位,那么 unlinkat 子例程等同于 rmdir 子例程。
参数
| 项 | 描述 |
|---|---|
| DirFileDescriptor | 指定打开的目录的文件描述符。 |
| 路径 | 指定要除去的目录项。 如果指定了DirFileDescriptor,且Path是相对路径名,则Path将被视为相对于DirFileDescriptor 指定的目录。 |
| 标志 | 指定位字段。 如果它包含 AT_REMOVEDIR 位和路径指向某个目录,那么将除去由 Path 指定的目录。 |
返回值
在成功完成后,将返回值 0。 否则,返回值为-1,全局变量errno被设置为显示错误,指定文件不会被更改。
错误代码
如果下列其中一项为 true ,那么 unlink 和 unlinkat 子例程将失败,并且不会取消链接指定的文件:
| 项 | 描述 |
|---|---|
ENOENT |
指定的文件不存在。 |
EACCES |
对包含要除去的链接的目录的写许可权被拒绝。 |
EBUSY |
要取消链接的条目是已安装文件系统的安装点,或者由 Path 命名的文件是已命名的 STREAM。 |
EPERM |
由 Path 参数指定的文件是一个目录,调用进程没有 root 用户权限。 如果 Path 参数指定的文件是 JFS2 文件系统中的目录,那么也会返回 |
EROFS |
要取消链接的项是只读文件系统的一部分。 |
如果以下一个或多个子例程为 true ,那么 unlinkat 子例程不成功:
| 项 | 描述 |
|---|---|
EBADF |
路径参数没有指定绝对路径,而DirFileDescriptor参数既不是 "AT_FDCWD,也不是有效的文件描述符。 |
ENOTDIR |
路径参数没有指定绝对路径,而DirFileDescriptor参数既不是 "AT_FDCWD,也不是与目录相关联的文件描述符。 |
EINVAL |
标志 参数的值是无效的。 |
由于其他原因, unlink 和 unlinkat 子例程可能不成功。 有关其他错误的列表,请参阅 ../bostechref/bos_error_codes.html
如果在系统上安装了 NFS ,那么如果满足以下条件,那么 unlink 和 unlinkat 子例程也可能失败:
| 项 | 描述 |
|---|---|
ETIMEDOUT |
连接已超时。 |