【C语言】access和stat函数

184 篇文章 3 订阅
173 篇文章 1 订阅

access

在C语言中,`access` 函数是一个用于检查文件的存在性以及对文件的访问权限的函数。它定义在 <unistd.h> 头文件中,通常在 Unix 系统中可用。这个函数可以用来验证当前用户是否有权访问指定的文件,以及这些权限的类型。

access 函数的原型如下:

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

其中:
- pathname 是一个指向以 null 结尾的字符串的指针,该字符串指定了需要检查权限的文件路径。
- mode 是一个整数,指定对文件所需的访问权限。它可以是以下几种值的组合:
  - R_OK 测试读权限。
  - W_OK 测试写权限。
  - X_OK 测试执行权限。
  - F_OK 测试文件的存在性。
函数返回值:
- 如果通过所有测试,`access` 函数返回0。
- 如果任一测试失败,或者发生错误,函数返回-1,并且`errno`会被设置为一个特定的错误代码,表明检查失败的原因。

示例代码:

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

int main() {
    const char *filepath = "/path/to/your/file";

    // 检查文件是否存在
    if (access(filepath, F_OK) == -1) {
        printf("File does not exist.\n");
    } else {
        printf("File exists.\n");

        // 检查文件是否可读
        if (access(filepath, R_OK) == -1) {
            printf("File is not readable.\n");
        } else {
            printf("File is readable.\n");
        }

        // 检查文件是否可写
        if (access(filepath, W_OK) == -1) {
            printf("File is not writable.\n");
        } else {
            printf("File is writable.\n");
        }

        // 检查文件是否可执行
        if (access(filepath, X_OK) == -1) {
            printf("File is not executable.\n");
        } else {
            printf("File is executable.\n");
        }
    }

    return 0;
}

在使用`access()`函数时需要考虑到它可能存在的安全隐患。由于存在时间差,即检查和使用之间的间隔,攻击者可能有机会在这个间隙中更改文件,这种攻击被称为时间竞争条件(TOCTOU)。因此,对于安全相关的检查,建议直接尝试对文件执行操作(比如打开文件),而不是先调用`access`进行检查。 

在大多数Unix系统的实现中,`R_OK`、`W_OK`、`X_OK` 和 F_OK 的整数值是:
- R_OK:4,测试读权限。
- W_OK:2,测试写权限。
- X_OK:1,测试执行权限。
- F_OK:0,测试文件的存在性。
所以,当看到如下代码:

ret = access(flagfile, 0);

它实际上在检查文件(由 flagfile 字符串表示的路径)是否存在。这里的整数值 0 对应于 F_OK。如果 ret 返回值是 0,则表示文件存在;如果返回 -1,则表示文件不存在或函数调用出现了其他错误,这时候可以检查 errno 以获得失败的具体原因。
使用整数值0作为 mode 参数是一种与使用 F_OK 同义的方式。在代码中直接使用对应的宏(如 F_OK),而非硬编码的整数(如 0),可以提高代码的可读性和可移植性。

stat

在C语言中,`stat` 函数是一个用来获取文件状态信息的函数,定义在 <sys/stat.h> 头文件中。这个函数可以获取文件大小、文件权限、最后修改时间等信息。

函数原型如下:

int stat(const char *path, struct stat *buf);

其中,`path` 参数是指向要检查的文件名的字符串指针。`buf` 参数是一个指向 struct stat 结构体实例的指针,这个结构体用来存储文件的状态信息。
stat 结构体通常至少包含以下成员:
- st_dev:文件所在设备的ID
- st_ino:文件的inode号
- st_mode:文件的模式,包括文件类型和文件权限位
- st_nlink:硬链接数目
- st_uid:文件所有者的用户ID
- st_gid:文件所有者的组ID
- st_rdev:如果是设备文件,则表示设备类型
- st_size:文件的大小,以字节为单位
- st_atime:最后访问时间
- st_mtime:最后修改时间
- st_ctime:最后状态变更时间(注:在UNIX系统中,修改inode信息的时刻)
stat 函数成功执行时,将返回0,并将文件的信息填入通过参数 buf 传递的结构体中。如果函数执行失败,将返回-1,并设置全局变量 errno 以指示具体的错误码。

stat 函数的例子

下面是一个简单的使用 stat 函数的例子:

#include <sys/stat.h>
#include <stdio.h>

int main() {
    struct stat file_stat;
    if (stat("example.txt", &file_stat) == 0) {
        printf("文件大小: %ld bytes\n", file_stat.st_size);
        printf("最后修改时间: %ld\n", file_stat.st_mtime);
        // 其他的文件信息也可以在这里打印出来
    } else {
        perror("stat");
    }
    return 0;
}

在这个例子中,我们尝试获取名为 "example.txt" 文件的相关信息,并打印文件大小和最后修改时间。如果获取信息时发生错误,我们使用 perror 函数来输出错误信息。

  • 30
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

109702008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值