• Linux学习之文件系统篇(三)


    基于inode函数介绍

    1.stat

    表头文件:    #include <sys/stat.h>
                       #include <unistd.h>
    定义函数:    int stat(const char *file_name, struct stat *buf);

    int fstat(int fd,struct stat *buf);

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

    函数说明:    通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
    返回值:      执行成功则返回0,失败返回-1,错误代码存于errno

    struct stat {
        dev_t         st_dev;       //文件的设备编号
        ino_t         st_ino;       //节点
        mode_t        st_mode;      //文件的类型和存取的权限
        nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1
        uid_t         st_uid;       //用户ID
        gid_t         st_gid;       //组ID
        dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号
        off_t         st_size;      //文件字节数(文件大小)
        unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小4096)
        unsigned long st_blocks;    //块数
        time_t        st_atime;     //最后一次访问时间
        time_t        st_mtime;     //最后一次修改时间
        time_t        st_ctime;     //最后一次改变时间(指属性)
    };

    stat 既有命令也有同名函数,用来获取文件Inode里主要信息,stat跟踪符号链接,lstat不跟踪符号理解

    stat里边时间辨析:

    atime(最近访问时间):

    mtime(最近更改时间):指的是修改文件内容的时间

    ctime(最近改动时间):指最近改动Inode的时间,比如更改文件权限位。文件更改必然会导致文件改动时间 改变,因为inode里边有文件属性一栏包括更改时间。

    #include<stdio.h>
    #include<stdlib.h>
    #include<errno.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<unistd.h>
    int main(int argc,char *argv[])
    {
        struct stat s_buf;
        if(argc<2)
        {
            printf("./app filename
    ");
            exit(1);
         }
         if(stat(argv[1],&s_buf)<0
         {
                perror("stat");
                exit(1);
           }
           printf("%s	%ld
    ",argv[1],s_buf.st_size);
           return 0;
    }

    2.access

    access函数的原型如下:

    #include<unistd.h>

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

    此函数是用来获得调用进程对pathname所指向的文件(regular)或者是目录(directory)的访问权限。

    pathname: 文件或者是目录路径

    mode:访问模式。可以F_OK,或者是F_OK和R_OK, W_OK,and X_OK的或(|)。F_OK,表示pathname所指向文件是否存;R,W,X判断实际用户ID是否有读写执行权限。按实际用户ID和实际组ID测试,跟踪符号链接。

    实际用户ID:

    有效用户ID:sudo执行时,有效用户ID是root,实际用户ID是用户名 

     3.chmod

    #include<sys/stat.h>
    
    int chmod(const char *path,mode_t mode);
    
    int fchmod(int fd,mode_t mode);

     注意:如果使用Linux的chmod命令时,得有root权限

     关于mode_t的定义;

      A:mode_t的定义实际就是unsigned int 形式的

      B:但是函数chmod(const char *path,mode_t mode)在解释mode_t时时将这里的mode当成8进制去解释

    参数mode有以下几种组合:

        

       S_ISUID  (04000)  set-user-ID  (set  process  effective  user   ID   on
                             execve(2))                                                                      //执行时设置用户ID
    
           S_ISGID  (02000)  set-group-ID  (set  process  effective  group  ID  on        
                             execve(2);  mandatory  locking,   as   described   in
                             fcntl(2);  take a new file's group from parent direc‐
                             tory, as described in chown(2) and mkdir(2))                                    //执行时设置组ID
    
           S_ISVTX  (01000)  sticky bit (restricted deletion flag, as described in
                             unlink(2))                                                                       //文件的黏着位
    
           S_IRUSR  (00400)  read by owner                                                             //文件所有者可读取权限                                                                    
    
           S_IWUSR  (00200)  write by owner                                                            //文件所有者具有可写入权限
    
           S_IXUSR  (00100)  execute/search  by owner ("search" applies for direc‐
                             tories, and means that entries within  the  directory
                             can be accessed)                                                           //文件所有者具有可执行权限
    
     
    
           S_IRGRP  (00040)  read by group                                                             //用户组具有可读取权限
    
           S_IWGRP  (00020)  write by group                                                            //用户组具有可执行权限
    
           S_IXGRP  (00010)  execute/search by group                                                   //用户组具有可执行权限
    
     
    
           S_IROTH  (00004)  read by others                                                             //其他用户具有可读取权限               
    
           S_IWOTH  (00002)  write by others                                                            //其他用户具有可写入权限
    
           S_IXOTH  (00001)  execute/search by others                                                  //其他用户具有可执行权限
    
     

          如要将文件test的权限修改为644,那么可以采用以下几种方法:

           chmod("文件名",S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);

           chmod("文件名",0644);

           chmod("文件名",420);

           说明:

           一、第一种方法是将00400和00200和00040和00004进行或运算,最终得到的结果就是0644(八进制),而八进制的0644就等于十进制的420,所以上面的几种方式等价的。

           二、当我们给chmod函数传递参数时他会将对应的十进制的mode参数转换为相应的八进制进行运算。所以,当我们要给函数中传入的文件的权限改为644时传递给函数chmod的参数不能直接是644.而应该是420.这是因为十进制的420就等于八进制的644.  

    注意:密码保存在shadow文件中,加密后显示。

    4.chown

    #include<unistd.h>
    
    int chown(const char *path,uid_t owner,gitd_t group);
    
    int fchown(int fd,uid_t owner,gitd_t group);
    
    int lchown(const char *path,uid_t owner,gitd_t group);
    
    chown 使用时必须拥有root权限。

    5.utime

    #include<sys/time.h>
    
    int utimes(const char *filename,const struct timeval times[2]);

    6.truncate

    #include<unistd.h>
    
    #include<sys/types.h>
    
    int truncate(concst char *path,off_t length);
    
    int ftruncate(int fd,off_t length);
  • 相关阅读:
    起名
    用超级巡警批量清除被挂马的网页
    我在csdn回复的帖子
    多线程与socket编程
    NET面试汇总
    第5 章: Windows Message Mapping 20080111 09:04 207人阅读 评论(0) 收藏
    oo的开始 分类: VC++ 20071228 14:31 176人阅读 评论(0) 收藏
    Cstring 截获数据 20080110 11:22 234人阅读 评论(0) 收藏
    截取字符串 20080110 08:18 188人阅读 评论(0) 收藏
    CString DOWRD互转 20080110 08:26 378人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/rainbow1122/p/7809785.html
Copyright © 2020-2023  润新知