> For the complete documentation index, see [llms.txt](https://man.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://man.bsdcn.org/sys/revoke.2.md).

# revoke(2)

`revoke` — 撤销文件访问

## 名称

`revoke`

## 库

Lb libc

## 概要

`#include <unistd.h>`

```c
int
revoke(const char *path);
```

## 描述

`revoke()` 系统调用使系统中针对 `path` 所命名文件当前所有打开的文件描述符失效。任何对这些描述符的后续操作都会失败，但例外是：对已撤销的字符设备文件进行 `read()` 会返回计数为零（文件结尾），且 `close()` 系统调用会成功。如果该文件是某个已打开设备的特殊文件，则设备关闭函数会被调用，如同所有对该文件的打开引用都通过一种不阻塞的特殊关闭方法被关闭一样。

只有文件的所有者或超级用户才能撤销对文件的访问。`revoke()` 系统调用目前仅支持字符特殊设备文件。它通常用于为新的登录会话准备终端设备，防止终端的前一用户进行任何访问。

## 返回值

成功完成时返回 0；否则返回 -1，并设置全局变量 errno 以指示错误。

## 错误

除非出现以下情况之一，否则对指定文件的访问将被撤销：

**\[ENOTDIR]** 路径前缀中的某个组件不是目录。

**\[ENAMETOOLONG]** 路径名的某个组件超过 255 个字符，或整个路径名超过 1024 个字符。

**\[ENOENT]** 指定的文件或路径名的某个组件不存在。

**\[EACCES]** 路径前缀中的某个组件拒绝搜索权限。

**\[ELOOP]** 在转换路径名时遇到过多的符号链接。

**\[EFAULT]** `path` 参数指向进程分配地址空间之外。

**\[EINVAL]** 实现不支持对指定文件的 `revoke()` 操作。

**\[EPERM]** 调用者既不是文件的所有者，也不是超级用户。

## 参见

[revoke(1)](/man1/revoke.1.md), [close(2)](/sys/close.2.md)

## 历史

`revoke()` 系统调用首次出现于 4.3BSD-Reno。

## 缺陷

非阻塞关闭方法仅对终端设备正确实现。
