插件窝 干货文章 linux c access函数怎么用

linux c access函数怎么用

文件 权限 检查 access 743    来源:    2025-04-30

Linux C 中 access() 函数的使用指南

access() 函数用于检查调用进程对指定文件的访问权限。它是 Unix/Linux 系统中一个非常有用的系统调用。

函数原型

#include <unistd.h>

int access(const char *pathname, int mode);

参数说明

  • pathname: 要检查的文件或目录的路径
  • mode: 要检查的访问权限,可以是以下值或其组合:
    • F_OK: 测试文件是否存在
    • R_OK: 测试读权限
    • W_OK: 测试写权限
    • X_OK: 测试执行权限

返回值

  • 成功: 返回 0 (所有请求的权限都允许)
  • 失败: 返回 -1 并设置 errno

使用示例

1. 检查文件是否存在

#include <unistd.h>
#include <stdio.h>

int main() {
    if (access("test.txt", F_OK) == 0) {
        printf("文件存在\n");
    } else {
        perror("文件不存在或无权限");
    }
    return 0;
}

2. 检查读写权限

#include <unistd.h>
#include <stdio.h>

int main() {
    const char *filename = "data.txt";

    if (access(filename, R_OK) == 0) {
        printf("文件可读\n");
    } else {
        perror("文件不可读");
    }

    if (access(filename, W_OK) == 0) {
        printf("文件可写\n");
    } else {
        perror("文件不可写");
    }

    return 0;
}

3. 组合检查

#include <unistd.h>
#include <stdio.h>

int main() {
    const char *filename = "script.sh";

    if (access(filename, F_OK | R_OK | X_OK) == 0) {
        printf("文件存在且可读可执行\n");
    } else {
        perror("权限检查失败");
    }

    return 0;
}

注意事项

  1. access() 检查的是实际用户(real UID/GID)的权限,而不是有效用户(effective UID/GID)的权限
  2. 对于符号链接,access() 会解引用链接检查目标文件的权限
  3. 在多线程程序中使用 access() 要小心竞态条件(TOCTTOU问题)
  4. 在检查后和使用文件前,文件状态可能已改变(race condition)

替代方案

对于更安全的文件操作,可以考虑: - faccessat() (更现代的替代方案) - 直接尝试打开文件并检查返回值

希望这个指南对你有帮助!如果你有关于 access() 函数的更具体问题,可以继续提问。