zoukankan      html  css  js  c++  java
  • 文件系统之 stat与access

    stat命令


    stat既有命令也有同名函数,用来获取文件Inode里主要信息,所以stat命令的输出信息比ls命令的输出信息要更详细,stat 跟踪符号链接,lstat不跟踪符号链接,其中会输出对应文件的文件名(File)、文件大小(Size)、占用物理扇区数(Blocks)、系统块大小(IO Block)、文件类型(前一篇博客中介绍的)、设备的主编号和次编号(Device做驱动程序时经常用到,在系统层面几乎用不到吧)、文件索引号(Inode文件节点)、硬链接个数(Links)、权限(Access)、用户id(Uid)、组id(Gid)、还有三个重要的时间。

    stat里面时间辨析:

    atime(最近访问时间access time): 最近打开文件的时间,读一次这个文件的内容,这个时间就会更新。比如对这个文件运用 more、cat等命令。但是ls、stat命令都不会修改文件的访问时间(在上一篇博客中已经介绍原因)。
    mtime(最近更改时间modifiy time): 指最近修改文件内容的时间 ,修改时间,修改时间是文件内容最后一次被修改时间。比如:vi后保存文件。ls -l列出的时间就是这个时间。
    ctime(最近改动时间change time): 指最近改动Inode的时间,状态改动时间。是该文件的i节点最后一次被修改的时间,通过chmod、chown命令修改一次文件属性,这个时间就会更新。

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    int stat(const char *path, struct stat *buf);
    int fstat(int fd, struct stat *buf);
    int lstat(const char *path, struct stat *buf);
    struct stat {
    dev_t st_dev; /* ID of device containing file 文件的设备编号*/
    ino_t st_ino; /* inode number 文件索引号(Inode文件节点)*/
    mode_t st_mode; /* protection 文件的类型和存取的权限*/
    nlink_t st_nlink; /* number of hard links 连到该文件的硬连接数目, 刚建立的文件值为1.*/
    uid_t st_uid; /* user ID of owner 文件所有者的用户识别码*/
    gid_t st_gid; /* group ID of owner 文件所有者的组识别码*/
    dev_t st_rdev; /* device ID (if special file) 若此文件为装置设备文件, 则为其设备编号*/
    off_t st_size; /* total size, in bytes 文件大小, 以字节计算*/
    blksize_t st_blksize; /* blocksize for file system I/O 文件系统的I/O 缓冲区大小*/
    blkcnt_t st_blocks; /* number of 512B blocks allocated 占用文件区块的个数, 每一区块大小为512 个字节*/
    time_t st_atime; /* time of last access 文件最近一次被存取或被执行的时间*/
    time_t st_mtime; /* time of last modification 文件最后一次被修改的时间*/
    time_t st_ctime; /* time of last status change 最近一次被更改的时间*/
    };

    access函数

    头文件:#include < unistd.h>

    定义函数:int access(const char * pathname, int mode);

    函数说明:access()会检查是否可以读/写某一已存在的文件。

    参数mode 有几种情况组合:
    1、R_OK, W_OK, X_OK和F_OK. R_OK, W_OK 与X_OK 用来检查文件是否具有读取写入和执行的权限。
    2、F_OK 则是用来判断该文件是否存在。由于access()只作权限的核查, 并不理会文件形态或文件内容,因此,如果一目录表示为”可写入”,表示可以在该目录中建立新文件等操作,而非意味此目录可以被当做文件处理。例如:你会发现DOS 的文件都具有”可执行”权限,但用execve()执行时则会失败。

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

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

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <time.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    int main(int argc, char *argv[])
    {
        //R_OK 是否有读权限
        //W_OK 是否有写权限
        //X_OK 是否有执行权限
        //F_OK 测试一个文件是否存在
        if(access("abc",F_OK) <0)
        {
            perror("abc");
            exit(1);
        }
    
        printf("abc is ok
    ");
    
        return 0;
    }
  • 相关阅读:
    字符集转换
    基础语法
    python print格式化输出。
    错误:SyntaxError: Missing parentheses in call to 'print'
    delphi 线程教学第一节:初识多线程
    delphi 7 信息对话框的按钮屏蔽键盘操作,只允许鼠标点击
    delphi 7 下安装 indy 10.5.8 教程
    delphi 实现vip126发邮件
    delphi 基础书籍推荐
    delphi 编码速度提升技能
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/6384163.html
Copyright © 2011-2022 走看看