• [置顶] access函数-linux


    表头文件

    #include<unistd.h>


    定义函数

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


    函数说明

    检查是否可以读/写某一已存在的文件。

    pathname: 文件/目录路径

    mode:

    R_OKW_OKX_OK: 检查文件是否具有读取、写入和执行的权限

    F_OK: 判断该文件是否存在

    由于access()只作权限的核查,并不理会文件形态或文件内容,因此,如果一目录表示为“可写入”,表示可以在该目录中建立新文件等操作,而非意味此目录可以被当做文件处理。例如,你会发现DOS的文件都具有“可执行”权限,但用execve()执行时则会失败。


    返回值
        若所有欲查核的权限都通过了检查则返回0值,表示成功,只要有一权限被禁止则返回-1。


    错误代码
        EACCESS 参数pathname 所指定的文件不符合所要求测试的权限。
        EROFS 欲测试写入权限的文件存在于只读文件系统内。
        EFAULT 参数pathname指针超出可存取内存空间。
        EINVAL 参数mode 不正确。
        ENAMETOOLONG 参数pathname太长。
        ENOTDIR 参数pathname为一目录。
        ENOMEM 核心内存不足    
        ELOOP 参数pathname有过多符号连接问题。
        EIO I/O 存取错误。


    附加说明
        使用access()作用户认证方面的判断要特别小心,例如在access()后再做open()的空文件可能会造成系统安全上的问题。


    例子:

    判断test文件是否存在

    #include <errno.h>

    #include <unistd.h>

    #include <stdio.h>

    int main()

    {

    int err = 0;

    err = access("/home/test" , F_OK);

    if ( err !=0 )

    {

    printf("erro!%d:%s ", errno , strerror(errno ));

    mkdir("/home/test", 0777);

    printf("erro!%d : %s " , errno, strerror(errno));

    }else

    printf("direxit! ");


    return 0;

    }

    1、/home下test文件是否存在

    如果传入的pathname是”/home/test"路径最后一个字符串不是斜杠’/’

    结果如下:

    root@VM-Ubuntu203001:~/test#./a.out

    dir exit!

    因为 test在/home下面是个文件,access判断这个文件已经存在,是正确的。


    2、/home下test目录是否存在

    如果传入的pathname是”/home/test/"路径最后一个字符串是斜杠’/’

    结果如下:

    root@VM-Ubuntu203001:~/test#./a.out

    erro!20:Nota directory

    erro! 17 : File exists

    测试结果是,access 把/home目录下面的test文件当做目录了,最后发现test不是目录,所以报错了。

    经过查找文档,


    [注释:如果linux文件路径的最后一个字符是斜杠’/’,那么linux会把这个路径当做目录路径来处理,而不管路径中的目录名实际上是个已经存在的文件名。]



  • 相关阅读:
    Mybatis多表查询
    (转)Java安全通信:HTTPS与SSL
    (转)RSA加密解密及数字签名Java实现
    (转)大型企业电话会议视频会议备份解决方案
    (转)虚拟IP原理
    虚拟IP---Linux下一个网卡配置多个IP
    C++ 点
    算法(8)Maximum Product Subarray
    算法(7)Majority Element II
    算法(6)3Sum Closest
  • 原文地址:https://www.cnblogs.com/james1207/p/3283577.html
Copyright © 2020-2023  润新知