美文网首页
access 和 errno (Linux C )

access 和 errno (Linux C )

作者: heyzqq | 来源:发表于2018-01-23 16:00 被阅读0次
    • errno
      • 在 linux 中使用 c 语言编程时,errno 是很有用的。它可以把最后一次调用 c 的方法的错误代码保留。但是如果最后一次成功的调用 c 的方法,errno 不会改变。因此,只有在 c 语言函数返回值异常时,再检测errno。
      • errno会返回一个数值(整型),每个数值代表一个错误类型。详细的可以查看头文件(Ubuntu16.04 在目录 /usr/include/asm-generic/ 下的 errno-base.h 和 errno.h )
    • access
      • 检查调用进程是否可以对指定的文件执行某种操作.

    一、errno

    errno 头文件:<errno.h>

    1. 用法 1 -- 将 errno 转成相应字符串(strerror)


    strerror 包含在头文件:<string.h>

    // 当 errno 被设置为相应的值时,利用 strerror 函数可以得到错误对应的原因
    printf("原因是:%s\n", strerror(errno));
    

    2. 用法 2 -- 直接输出错误对应的原因 (perror)


    perror 包含在头文件:<stdio.h>

    perror("前缀");
    // 输出结果如下,会在 前缀 后面加上 ': 原因xxx\n'
    前缀: No such file or directory
    
    

    3. 常用用法


    一般情况下,会先对操作的返回值进行比较,如果某一操作失败了,再对 errno 进行具体的比较(比如文件不存在 - ENOENT,没有权限 - EPERM 等)

    // demo:test.c
    #include <stdio.h>
    #include <unistd.h>  // access
    #include <errno.h>
    #include <string.h>  // strerror
    
    int main(void)
    {
        int ret;
    
        ret = access("/dev/ttxy", F_OK);
    
        printf("/dev/ttxy is existence: %s\n", (ret==0)?"Yes":"No");
    
        if (ret != 0){
            if (errno == ENOENT){  // if (errno)
                perror("perror");
                printf("printf: %s(%d)\n", strerror(errno), errno);
            }
        } 
    
        return 0;
    }
    
    

    输出如下:

    /dev/ttxy is existence: No
    perror: No such file or directory
    printf: No such file or directory(2)
    

    二、access

    1. access 判断模式


    • R_OK 只判断是否有读权限
    • W_OK 只判断是否有写权限
    • X_OK 判断是否有执行权限
    • F_OK 只判断是否存在

    2. 返回值


    access 头文件:<unistd.h>

    • 成功,返回 0
    • 失败,返回 -1,并设置相应的 errno

    3. 模式可以同时判断


    // file: myaccess.c
    #include <stdio.h>
    #include <unistd.h>  // access
    #include <errno.h>
    #include <string.h>  // strerror
    
    int main(void)
    {
        int ret;
    
        ret = access("./test", F_OK | R_OK | W_OK);
        if (ret != 0){ 
            perror("frw");
        }else{
            printf("FRW OK\n");
        }   
    
        ret = access("./test", F_OK | R_OK | W_OK | X_OK);
        if (ret != 0){ 
            perror("frwx");
        }else{
            printf("FRWX OK\n");
        }   
    
        return 0;
    }
    
    

    输出如下:

    [root@ test]# ls -l test 
    # test 文件没有可执行权限
    -rw-rw-r-- 1 root root 0 1月  23 13:53 test
    [root@ test]# ./myaccess
    FRW OK
    frwx: Permission denied (错误原因:没去执行权限)
    

    [reference]

    [1] eager7. C语言中access函数[M]. (2012年10月31日 09:42:05) http://blog.csdn.net/eager7/article/details/8131169
    [2] shengxiaweizhi. linux中c语言errno的使用[M]. (2015年05月30日 22:56:33) http://blog.csdn.net/shengxiaweizhi/article/details/46279447

    相关文章

      网友评论

          本文标题:access 和 errno (Linux C )

          本文链接:https://www.haomeiwen.com/subject/etisaxtx.html