• unix环境高级编程——文件和目录


    文件系统特征和文件的性质

    函数stat,fstat,fstatat,lstat   <sys/stat.h>

    int stat(const char * restrict pathname,struct stat* restrict buf);

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

    int lstat(const char* restrict pathname,struct stat* restrict buf,int flag);

    int fstatat(int fd,const char* restrict pathname,struct stat* restrict buf,int flag)

    一但给出pathname,stat函数返回与此命名文件有关的信息结构,  

    fstat函数获得已在描述符fd上打开文件的有关信息,  ll

    lstat函数类似于stat,但是当命名的文件是一个符号链接时,lstat返回符号链接的有关信息,而不是由该符号链接引用的文件的信息,  

    fstatat函数为一个相对于当前打开目录(由fd指向)的路径名返回文件统计信息

    struct stat {

            mode_t     st_mode;       //文件对应的模式,文件,目录等(包含对文件的访问权限)

            ino_t      st_ino;         //inode节点号

            dev_t      st_dev;          //设备号码

            dev_t      st_rdev;        //特殊设备号码

            nlink_t    st_nlink;        //文件的连接数

            uid_t      st_uid;           //文件所有者

            gid_t      st_gid;              //文件所有者对应的组

            off_t      st_size;             //普通文件,对应的文件字节数

            time_t     st_atime;         //文件最后被访问的时间

            time_t     st_mtime;        //文件内容最后被修改的时间

            time_t     st_ctime;         //文件状态改变时间

            blksize_t st_blksize;       //文件内容对应的块大小

            blkcnt_t   st_blocks;       //伟建内容对应的块数量

          };

    文件类型:

    普通文件

     目录文件

    块特殊文件

    字符特殊文件

    FIFO

    套接字

    符号链接

    POSIX允许将进程间通信(IPC)对象说明为文件   

    设置用户ID和设置组ID

    与一个进程相关联的ID有6个或者更多

    实际用户ID     用于标志我们是谁,在登录时取自口令文件登录项

    实际组ID      用于标志我们是谁,在登录时取自口令文件登录项

      

    有效用户ID     用于文件访问权限检查

    有效组ID      用于文件访问权限检查

    所属组ID      用于文件访问权限检查

    保存的设置用户ID  由exec函数保存

    保存的设置组ID   由exec函数保存

    通常有效用户ID等于实际用户ID,有效组ID等于实际组ID

    可以在文本字模式(st_mode)中设置一个特殊标志位(suid)让当执行此文件时,进程的有效用户ID设置为文件所有者的ID 相应的,可以设置sgid来让有效组ID设置为文件的组所有者ID

    文件访问权限:

    S_IRUSR                          S_IRGRP                             S_IRGOTH                                              

    S_IWUSR                            S_IWGRP                               S_IWOTH                                                

    S_IXUSR                           S_IXGRP                             S_IXOTH                                                   

    chmod命令允许我们用u表示用户,g表示组,o表示其他

    权限规则:

    要打开某一个文件,需要对其从更目录到文件所在目录中间的所有目录都应该具有执行权限(x)(决定能否进入该目录)    对于目录,其执行权限(x)常被称为搜索位

    读权限允许我们读目录,获取在该文件中所有文件名的列表

    对一个文件的读权限决定了我们能否打开现有文件进行读操作,与open函数的O_RDONLY和O_RDWR有关

    对一个文件的写操作决定了我们能否打开现有文件进行写操作,与open函数的O_WRONLY和O_RDWR有关

    权限对于文件:

    r    读取一个档案的实际内容

    w   编辑,新增,修改文件的内容(不包括删除文件的权限)

    x    该文件是否可以被系统执行

    权限对于目录:

    r     读取目标结构清单的权限

    w    建立新的文件与目录  删除已经存在的文件与目录(不管文件的权限如何) 重命名已经存在的文件以及目录  移动文件以及目录的权限

    x    使用者能否进入该目录并使之成为工作目录

    新文件和目录的所有权

    新文件的用户ID为进程的有效ID

    新文件的组ID为进程的有限组ID也可以是它所在目录的组ID  对于linux新文件的组ID取决于他所在的目录的组ID是否被设置,如果设置,文件的组ID即目录的组ID,如果未设置,新文件的组ID为进程的组ID

    函数access和faccessat  <unistd.h>

    access和faccessat函数以实际用户ID和实际组ID而不是进程ID和进程组ID来进行访问测试

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

    it faccessat(int fd,const char* pathname,int mode,int flag);

    返回值:若成功,返回0,若失败,返回-1

    mode   R_OK(读权限测试)    W_OK(写权限测试)    X_OK(执行权限测试)

    flag参数可以用来改变faccessat函数的行为,如果flag设置为AT_EACCESS,访问检查用的是调用进程的有效用户ID和有效组ID,而不是实际用户ID和实际组ID

    函数umask:  <sys/stat.h>    

    mode_t umask(mode_t cmask);    umask函数为进程设置文件模式创建屏蔽字,并返回之前的值,(没有出错返回函数)

    cmask由上面6个文件访问权限常量按位或构成

     在进程创建一个新文件或新目录的时候,通过文件模式创建屏蔽字

    open和creat函数中的参数mode指定了新文件的访问权限位    创建一个新文件或目录时,在文件模式创建屏蔽字为1的位,在文件mode中的相应位被关闭

    子进程的umask屏蔽字不影响父进程的umask屏蔽字

    函数chmod,fchmod,fchmodat   <sys/stat.h>

    int chmod(const char* pathname,mode_t mode);            在指定的文件上进行操作

    int fchmod(int fd,mode_t mode);                    对已打开的文件进行操作

    int fchmodat(int fd,const char* pathname,mode_t mode,int flag);       

    flag参数用于改变fchmodat的值,当设置为AT_SYMLINK_NOFOLLOW时,fchmodat不会跟随符号链接

    当fd设置为AT_FDCWD时,path为相对路径,否则默认为相对于打开目录(fd)进行查找

    为了改变一个文件的权限位,进程的有效用户ID必须等于文件的所有者ID,或者具有root权限

    参数mode:

                         S_IRWXU(全操作)    S_IRWXG(全操作)     S_IREXO(全操作)      

    S_ISUID(SUID)               S_IRUSR          S_IRGRP          S_IROTH

    S_ISGID(SGID)               S_IWUSR         S_IWGRP          S_IROTH

    S_ISVTX保存正文(粘着位)      S_IXUSR          S_IXGRP            S_IXOTH

    组执行权限为S表示设置组ID位已经设置,同时,组执行位未设置

    只有超级用户才能设置普通文件的粘着位(FreeBSD和Solaris系统中,Mac和Linux无限制(因为对普通文件无意义))

    粘着位:

    函数chown,fchown,fchownat,lchown <unistd.h>

    文件长度

    文件中的空洞

    文件截断

    文件系统

    函数link,linkat,unlink,unlinkat,remove

    函数rename,renameat  <stdio.h>

    符号链接

    创建读取符号链接

    文件时间

    函数futimens,utimensat,utime  <sys/stat.h>

    函数mkdir,mkdirat,rmdir  <sys/stat.h>

    读目录

    函数chdir,fchdir,getcwd  <unistd.h>

    设备特殊文件

    文件访问权限小结

  • 相关阅读:
    Centos7安装docker-ce
    postgresql-11主从复制(流复制)部署
    centos7安装postgreSql11
    CentOS7下安装PostgreSQL12
    postgres生成uuid
    软工第一次团队展示
    软工第一次结对编程作业
    软工第一次个人编程作业
    课程总结
    团队作业
  • 原文地址:https://www.cnblogs.com/chen1262567640/p/11187940.html
Copyright © 2020-2023  润新知