zoukankan      html  css  js  c++  java
  • 《APUE》第四章笔记(1)

    1.引言

    本章介绍文件系统的特征和文件的性质。从stat函数开始,逐个说明stat结构的每一个成员以了解文件的所有属性。在此过程中,还将会说明修改这些属性的各个函数,并更详细地查看UNIX文件系统的结构和符号连接,最后还介绍对目录进行操作的各个函数。


    大概就是介绍以下几点:
    1.stat函数和stat结构的每一个成员(这些都是文件的属性)。
    2.修改每个属性的对应函数。(比如修改文件权限的chmod函数)。
    3.UNIX文件系统的结构和符号链接
    4.对目录进行操作的各个函数。


    先介绍3个stat函数:
    #include <sys/stat.h>
    int stat(const char *pathname, struct stat *buf); //一旦给出pathname,stat函数就返回与此命名文件有关的信息结构
    int fstat(int fd, struct stat *buf); //而fstat则获取文件描述符fd来打开文件信息
    int lstat(const char *pathname, struct stat *buf); //lstat函数则类似stat,但当pathname是符号链接的时候,就返回符号连接的有关信息而不是文件信息(符号链接会在以后介绍)


    第二个参数buf是指针,它指向一个由我们提供的stat结构,而这些函数呢就将信息写进stat结构中。


    下面给出stat结构的成员(不同系统可能实现不同,但是基本形式是差不多的):
    /* 我用"man 2 stat"给出stat的结构定义的 */
    struct stat {
    dev_tst_dev;/* ID of device containing file */
    ino_t st_ino;/* inode number */
    mode_tst_mode;/* protection */
    nlink_tst_nlink;/* number of hard link */
    uid_tst_uid;/* user ID of owner */
    gid_tst_gid;/* group ID of owner */
    dev_tst_rdev;/* device ID (if special file) */
    off_tst_size;/* total size, in bytes */
    blksize_tst_blksize;/* blocksize for filesystem I/O */
    bllcnt_tst_blocks;/* number of 512B blocks allocated */


    /* 下面的定义是Linux 2.6之后加进来的 */
    struct timespecst_atim;/* time of lass access (最后一次查看文本内容)*/
    struct timespecst_mtim;/* time of last modification (最后一次修改文本内容)*/
    struct timespecst_ctim;/* time of last status change (最后改变文件状态)*/
    #definest_atimest_atim.tv_sec;/* 向后兼容 */
    #definest_mtimest_mtim.tv_sec;
    #definest_ctimest_ctim.tv_sec; 
    };


    使用stat函数最多的可能是ls -l命令了,用其可以获得一个文件的所有信息。


    文件类型:


    UNIX/LInux中的文件类型可分为7种。
    1.普通文件(regular file):
    最常用的文件类型,这种文件包含了某种形式的数据。
    2.目录文件(directory file):
    这种文件包含了其他文件的名字以及指向这些文件有关信息的指针。对一个目录文件具有读权限的任一进程都可以读该目录的内容。但只有内核可以直接写目录文件。进程必须使用上述提到的第4点的函数才能更改目录。
    3.块特殊文件(block special file):
    这种文件类型提供对设备(例如磁盘)带缓冲的访问,每次访问都以固定长度为单位进行。
    4.字符特殊文件(character special file):
    这种文件类型提供对设备不带缓冲的访问,每次访问长度可变。系统中的所有设备要么是字符特殊文件,要么是块特殊文件。
    5.FIFO:
    这种类型文件用于进程间通信,有时也将其命名为管道(named pipe)。
    6.套接字(socket):
    这种文件类型用于进程间的网络通信。
    7.符号链接(symbolic link):
    这种文件类型指向另一个文件。


    文件类型信息保存在stat结构的st_mode成员中。可以用下面的宏来确定文件类型:
    #include <sys/stat.h>
    S_ISREG()//普通文件
    S_ISDIR()//目录文件
    S_ISSCHR()//字符特殊文件
    S_ISBLK()//块特殊文件
    S_ISFIFO()//管道或FIFO
    S_ISLINK()//符号链接
    S_ISSOCK()//套接字
    如果S_ISDIR(st_mode)返回的是真,是目录文件,否则不是目录文件。


    设置用户ID和设置组ID

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


    实际用户ID和实际组ID标识我们究竟是谁。这两个字段取自登陆时的口令文件中的登陆项。
    有效用户ID和有效组ID则决定了我们的文件访问权限。(接下来只讲这四个)

    一般来说,实际用户ID等于有效用户ID,实际组ID等于有效组ID。(因为你登陆了你当然是访问自己的home文件)
    每一个文件都有一个所有者和组所有者,所有者由stat结构中的st_uid成员表示,组所有者则由st_gid成员表示。

    在执行一个程序文件时,进程的有效用户ID通常就是实际用户ID,有效组ID通常就是实际组ID。但是可以在st_mod中设置一个特殊标志,其含义是:“当执行此文件时,将进程的有效用户ID设置为文件所有者的用户ID(st_uid)”。与此类似,还可以设置另一位,它使得将执行此文件的进程的有效组ID设置为文件的组所有者ID(st_gid)。这就是设置用户ID(Set-User-ID)和设置组ID(Set-Group-ID)。
    例如,若文件所有者时超级用户,而且设置了该文件的设置用户ID,然后当该程序由一个进程执行时,则该进程具有超级用户特权(也就是有效用户ID设置为文件所有者的ID)。不管执行该进程的实际用户ID是什么,都进行这种处理。例如,UNIX程序passwd(1)允许用户改口令(一般是/etc/passwd或/etc/shadow),而只有超级用户才具有对该文件写的权限,所以需要设置用户ID。因为运行设置用户ID的进程通常得到额外的权限,所以编写这种程序时要特别谨慎。


    文件访问权限:


    每个文件有9个访问权限,可以分为三类:所有者,组,和其他人。每类分别有读(r),,写(w)和执行(x)的权限。
    由st_mode决定,具体可google。


    对于目录的读权限和执行权限的意义是不同的。读权限就是能够获取里面文件的名字(就像用ls),但是执行权限就是当对里面的文件执行某种操作的时候(比如 ls -l *file),如果没有目录的执行权限的话就执行不了。
    在目录中创建一个新文件,就必须对该目录具有写权限和执行权限。
    为了删除一个现有的文件,就必须对包含该文件的目录具有写权限和执行权限,对该文件本身则不需要写和执行权限。


    第四章笔记待续。



  • 相关阅读:
    ubuntu之路——day8.4 Adam自适应矩估计算法
    ubuntu之路——day8.3 RMSprop
    ubuntu之路——day8.2 深度学习优化算法之指数加权平均与偏差修正,以及基于指数加权移动平均法的动量梯度下降法
    ubuntu之路——day8.1 深度学习优化算法之mini-batch梯度下降法
    ubuntu之路——day7.4 梯度爆炸和梯度消失、初始化权重、梯度的数值逼近和梯度检验
    redis作为mysql的缓存服务器(读写分离)
    阿里云服务器上配置并使用: PHP + Redis + Mysql 从配置到使用
    小程序开发测试教程
    使用PHP并发执行任务–curl_multi应用
    PHP返回变量或数组的字符串表示:var_export()
  • 原文地址:https://www.cnblogs.com/fusae-blog/p/4256791.html
Copyright © 2011-2022 走看看