『 Linux 』目录与软硬链接 (万字详解)

文章目录

    • 如何理解目录
      • 目录项
    • 目录中的权限问题
    • 根目录
    • Dentry缓存
    • 文件的增删改查与文件系统关系
    • 软硬链接
      • 软链接
      • 硬链接


如何理解目录

请添加图片描述

目录是一个文件存在其对应独立的Inode;

$ stat dir
  File: ‘dir’
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: fd01h/64769d    Inode: 2360193     Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1002/    _XXX)   Gid: ( 1002/    _XXX)
Access: 2024-06-03 19:07:42.139437045 +0800
Modify: 2024-06-03 19:07:40.931391471 +0800
Change: 2024-06-03 19:07:40.931391471 +0800
 Birth: -

文件的实质是内容与属性的结合;

struct inode {
    uint16_t i_mode;        // 文件类型和权限
    uint16_t i_uid;         // 文件所有者的用户ID
    uint32_t i_size;        // 文件大小(字节)
  	/* ... */
    uint32_t i_flags;       // 文件标志
    uint32_t i_block[15];   // 数据块指针
    // 其他文件系统特定的信息
};

当访问文件时需要通过Inode中的数据块指针数组字段中的元素直接或间接访问数据块中的数据;

目录文件的Inode中的数据块指针指向的内容称为目录项;


目录项

请添加图片描述

目录项是目录文件的Inode中的数据块指针数组直接或间接指向的内容;

是属于目录文件的内容;

目录项中包含了当前目录下的所有文件名以及Inode之间的关系;

struct ext2_dir_entry {
    uint32_t inode;      // inode编号
    uint16_t rec_len;    // 目录项长度
    uint8_t name_len;    // 文件名长度
    uint8_t file_type;   // 文件类型
    char name[];         // 文件名
};

/// 例: 目录项1 文件名"file.txt"
/*
	{
        inode: 10,
    	rec_len: 16,
   		name_len: 9,
    	file_type: 1, // 普通文件
    	name: "file1.txt"
	}
*/

以先描述后组织的关系保存当前目录下所有文件的基本信息;

  • 目录项的作用

    • 文件名到Inode的映射

      目录想主要作用是将文件名映射到对应的Inode编号;

      虽然是以目录项的形式存在,但是以抽象来看的话是一个KeyValue结构;

      通过目录项使得文件系统能够通过文件名找到对应文件的Inode,从而访问文件的元数据和内容;

    • 目录结构的组织

      目录想使得文件系统能够组织和管理目录结构;

      通过目录项用户可以浏览和访问目录中的文件和该目录文件中的其他子目录文件;

假设需要访问一个目录文件为/aa/bb/cc/dd.txt,需要进行以下操作:

  • 获取根目录(/)的inode:
    • 从inode表中获取根目录的inode;
  • 访问根目录的数据块:
    • 通过根目录的inode指针,找到根目录的数据块;
    • 在根目录的数据块中查找名为aa的目录项,获取其对应的inode编号;
  • 访问aa目录:
    • 通过aa目录的inode编号,找到aa目录的inode;
    • 读取aa目录的inode,获取其指向的数据块指针;
    • 通过aa目录的inode指针,找到aa目录的数据块;
    • aa目录的数据块中查找名为bb的目录项,获取其对应的inode编号;
  • 访问bb目录:
    • 通过bb目录的inode编号,找到bb目录的inode;
    • 读取bb目录的inode,获取其指向的数据块指针;
    • 通过bb目录的inode指针,找到bb目录的数据块;
    • bb目录的数据块中查找名为cc的目录项,获取其对应的inode编号;
  • 访问cc目录:
    • 通过cc目录的inode编号,找到cc目录的inode;
    • 读取cc目录的inode,获取其指向的数据块指针;
    • 通过cc目录的inode指针,找到cc目录的数据块;
    • cc目录的数据块中查找名为dd.txt的目录项,获取其对应的inode编号;
  • 访问dd.txt文件:
    • 通过dd.txt文件的inode编号,找到dd.txt文件的inode;
    • 读取dd.txt文件的inode,获取其指向的数据块指针;
    • 通过dd.txt文件的inode指针,找到文件的实际数据块,读取文件内容;

目录中的权限问题

请添加图片描述

  • 为什么同一个目录下不能有同名文件?

    目录是文件,其Inode中的指针数组中数组中指针指向的数据块中存放的数据为目录项;

    目录项为当前目录下所有文件的文件名与Inode编号的映射关系(以结构体方式存在);

    这个映射关系为类似一个KeyValue的形式;

    若是Key值存在重复则无法有效找到对应文件的Inode从而不能正确找到需要访问的文件;

文件将通过自身的文件属性控制不同用户对该文件的操作权限;

而目录文件也是文件,其在文件系统中有独立的Inode,所以目录同样存在权限;

$ ll
total 4
drwxrwxr-x 2 _XXX _XXX 4096 Jun  3 19:07 dir
-rw-rw-r-- 1 _XXX _XXX    0 Jun  3 19:07 log.txt
  • 权限类型

    每个文件和目录都有三个权限类型:读( r ),写( w )和执行( x );

    这些权限分别适用于文件所有者(user),文件所属组(group)和其他用户(others);

  • 权限表示

    权限通常用一个9位的字符串表示,如上图为例的rwxrwxr-xrw-rw-r--(第一个字符表示文件类型,d表示目录文件);

    前三位表示文件所有者的权限;

    中间三位表示文件所属组的权限;

    最后三位表示其他用户的权限;

对于普通文件而言其文件权限如下:

  • 读权限( r )

    允许用户读取文件的内容;

    若是没有读权限用户但有写与执行权限时可以对文件进行修改与执行但无法利用类似的cat命令将文件内容进行展示;

    $ cat log.txt 
    cat: log.txt: Permission denied
    
  • 写权限( w )

    允许用户修改文件的内容;

    若是没有写权限但是有读权限与执行权限时可以利用类似cat的命令读取文件内容与执行文件但是无法对文件内容进行增删改等写入操作;

    $ chmod 550 log.txt 
    $ cat log.txt 
    hello
    $ echo "world\n" > log.txt 
    bash: log.txt: Permission denied
    
  • 执行权限( x )

    允许用户执行文件(如果文件是可执行程序或是脚本);

    若是没有执行权限则无法运行文件;

    $ ll
    total 8
    d-wx-wx-wx 2 _XXX _XXX 4096 Jun  3 19:07 dir
    -rw-rw-rw- 1 _XXX _XXX    6 Jun  4 10:55 log
    $ ./log
    bash: ./log: Permission denied
    

对于目录文件如下:

  • 读权限( r )

    允许用户查看目录中的文件列表 (包括目录文件) ;

    若是没有读权限但有写权限和执行权限时可以进入目录并在目录中进行增删改等操作但无法使用ls等命令读取该目录中的文件列表;

    $ chmod 330 dir
    $ ls dir/
    ls: cannot open directory dir/: Permission denied
    
  • 写权限( w )

    允许用户在目录中创建,删除和重命名文件和子目录;

    若是没有写权限则但有读和执行权限时可以进入目录并使用ls等命令展示当前目录的内容但无法对目录中的文件进行增删改查等操作;

    $ chmod 550 dir
    $ touch dir/test.txt
    touch: cannot touch ‘dir/test.txt’: Permission denied
    
  • 执行权限( x )

    允许用户进入该目录 ;

    若是没有执行权限时即使拥有其他权限也无法对目录进行任何操作(目录文件中执行权限x是所有操作的前提);

    $ chmod 660 dir
    $ cd dir
    bash: cd: dir: Permission denied
    $ ll dir
    ls: cannot access dir/dir: Permission denied
    ls: cannot access dir/log.txt: Permission denied
    ls: cannot access dir/hello.txt: Permission denied
    ls: cannot access dir/test.txt: Permission denied
    total 0
    d????????? ? ? ? ?            ? dir
    -????????? ? ? ? ?            ? hello.txt
    -????????? ? ? ? ?            ? log.txt
    -????????? ? ? ? ?            ? test.txt
    $ touch dir/makefile
    touch: cannot touch ‘dir/makefile’: Permission denied
    

根目录

请添加图片描述

在Linux中,由根目录至其他的所有的目录文件的整体构造被称为操作系统目录树;

  • 操作系统目录树

    操作系统目录树是文件系统的核心结构之一,以属性结构组织和管理文件和目录;

    使得所有的文件和目录都已层次化的方式进行组织,且每个目录都可以包含子目录和文件;

  • 根目录

    根目录是整个操作系统目录树的起点也是最高顶点,通常为/;

    通常操作系统目录树的根目录/所在的文件系统被称为根文件系统;

    每个文件系统被创建时将默认存在一个根目录/;

  • 根文件系统

    挂载至操作系统目录树中根目录/的文件系统被称为根文件系统;

当存在多个分区(文件系统)时,分区必须以挂载的形式挂载至操作系统目录树之中;

在进行分区时将会把分区格式化为一个文件系统,以便于存储文件和目录;

根目录也是一个目录,也是一个文件,在文件系统中有自己的Inode编号和属性,通常在创建一个文件系统时会创建对应的根目录,并在其InodeTable表中维护根目录的Inode信息;

而为了方便用户的操作,实际上每当进行一次分区(创建出一个文件系统)过后操作系统内核都会默认为其生成一个根目录/;

但在创建一个新的分区后不能立即使用,必须以挂载的形式将其挂载至操作系统目录树之中;

一但挂载成功其文件系统的根目录将会变成挂载时所设置的名称,在文件系统中其算是一个根目录而在整体的操作系统目录树中并不是根目录;

文件系统的创建通常如下:

  • 分区

    采用分区工具将磁盘划分为一个或多个分区;

  • 格式化分区

    利用文件系统工具将分区格式化为一个特定的文件系统类型,其中文件系统的根目录的创建也属于格式化中的一环;

  • 创建挂载点

    在根文件系统中创建一个目录为挂载点;

  • 挂载分区

    将分区挂载至挂载点;

所以在一整个体系中只有一个根目录(根文件系统所挂载的目录);

对于各个文件系统的根目录而言,操作系统内核将选择一个文件系统作为根文件系统;

而将根文件系统挂载至/的操作一般可以理解为告诉操作系统该目录将作为整个操作系统目录树的最高顶点(起点);


Dentry缓存

请添加图片描述

访问或操作任何一个文件/程序都要带路径并通过路径访问其目录项获得对应的Inode逐级进行访问;

这是一个效率过低的操作,无论进行任何操作都要从根目录开始寻找;

为了提高效率操作系统将进行一个Dentry缓存;

Dentry缓存是内核中的一个内存缓存,用于存储最近访问过的目录项,通常以结构体的形式存在;

每个Dentry结构体表示文件系统中的一个目录项,包含文件名和对应的Inode信息;

其结构信息可以参照如下:

struct dentry {
    atomic_t d_count;                  // 引用计数
    unsigned int d_flags;              // 标志
    spinlock_t d_lock;                 // 自旋锁
    int d_mounted;                     // 挂载计数
    struct inode *d_inode;             // 指向对应的inode
    struct hlist_node d_hash;          // 哈希链表节点
    struct dentry *d_parent;           // 父目录的dentry
    struct qstr d_name;                // 文件名
    struct list_head d_lru;            // LRU链表节点
    struct list_head d_child;          // 子目录链表节点
    struct list_head d_subdirs;        // 子目录链表头
    struct rcu_head d_rcu;             // RCU头
    // 其他字段省略
};

这个缓存用于加速路径解析从而提高文件和目录的访问效率;

通过缓存目录项,文件系统可以快速查找文件和目录,而无需每次都从磁盘中读取目录项;

一般当进行一个目录或文件的访问通常会有以下操作:

  • 路径解析

    当用户访问文件或目录时,文件系统会解析路径并在Dentry缓存找找到对应的目录项;

    如果在Dentry缓存中找到目录项,文件系统可以直接使用缓存中的Inode编号找到对应的Inode信息从而无需从磁盘中重新依次读取目录项;

  • 缓存命中和未命中

    • 缓存命中:

      如果目录项在Dentry缓存中这种被称为缓存命中,文件可以直接使用缓存中的信息;

    • 缓存未命中;

      如果在Dentry缓存中未找到目录项,即目录项不在Dentry缓存中被称为缓存未命中;

      此时文件系统需要从新从磁盘中读取目录项并添加到Dentry缓存中并进行使用同时方便后续访问时使用;

  • 缓存管理

    Dentry缓存使用引用计数等方式管理缓存项;

    当缓存项的引用计数为0且缓存缓存空间不足时将会移除未使用时间最长的缓存想以释放空间;


文件的增删改查与文件系统关系

请添加图片描述

  • 创建文件(增)

    • 分配inode:

      文件系统首先在inode表中找到一个空闲的inode,并将其分配给新文件;
      初始化inode的元数据,包括文件类型、权限、所有者、时间戳等;

    • 创建目录项(dentry):

      在目标目录中创建一个新的目录项(dentry),将新文件的名称与分配的inode关联起来;
      更新目录的inode信息(如链接计数、修改时间等);

    • 分配数据块:

      当文件内容被写入时,文件系统在数据区找到空闲的数据块,并将其分配给文件;
      更新inode中的数据块指针,指向分配的数据块;

  • 删除文件(删)

    • 删除目录项(dentry):

      文件系统在目标目录中找到对应的目录项,并将其删除;
      更新目录的inode信息(如链接计数、修改时间等);

    • 释放inode:

      文件系统将文件的inode标记为空闲,并从inode表中移除;
      更新inode的元数据,清除文件类型、权限、所有者、时间戳等信息;

    • 释放数据块:

      文件系统将文件占用的数据块标记为空闲,并从数据区中移除;
      更新inode中的数据块指针,清除指向的数据块信息;

  • 修改文件(改)

    • 找到inode:

      文件系统在目录中找到对应的目录项,获取文件的inode;

    • 分配或重新分配数据块:

      当文件内容被修改时,文件系统在数据区找到空闲的数据块,并将其分配给文件;
      如果文件内容增加,需要分配新的数据块;如果文件内容减少,可能需要释放部分数据块;
      更新inode中的数据块指针,指向新的或修改后的数据块;

    • 更新inode元数据:

      更新inode的元数据,包括文件大小、修改时间等信息;

  • 读取文件(查)

    • 找到inode:

      文件系统在目录中找到对应的目录项,获取文件的inode;

    • 读取数据块:

      根据inode中的数据块指针,文件系统读取文件的数据块;
      将数据块中的内容读取到用户提供的缓冲区中;

    • 更新inode元数据:

      更新inode的元数据,包括访问时间等信息;


软硬链接

请添加图片描述

在文件系统中,存在 “链接” 的概念;

指一个文件系统对象与其名称之间的关联;

在Linux中可以使用ln命令为文件或目录创建链接;

其对应文档如下:

$ ln --h
Usage: ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
  or:  ln [OPTION]... TARGET                  (2nd form)
  or:  ln [OPTION]... TARGET... DIRECTORY     (3rd form)
  or:  ln [OPTION]... -t DIRECTORY TARGET...  (4th form)
In the 1st form, create a link to TARGET with the name LINK_NAME.
In the 2nd form, create a link to TARGET in the current directory.
In the 3rd and 4th forms, create links to each TARGET in DIRECTORY.
Create hard links by default, symbolic links with --symbolic.
By default, each destination (name of new link) should not already exist.
When creating hard links, each TARGET must exist.  Symbolic links
can hold arbitrary text; if later resolved, a relative link is
interpreted in relation to its parent directory.

Mandatory arguments to long options are mandatory for short options too.
      --backup[=CONTROL]      make a backup of each existing destination file
  -b                          like --backup but does not accept an argument
  -d, -F, --directory         allow the superuser to attempt to hard link
                                directories (note: will probably fail due to
                                system restrictions, even for the superuser)
  -f, --force                 remove existing destination files
  -i, --interactive           prompt whether to remove destinations
  -L, --logical               dereference TARGETs that are symbolic links
  -n, --no-dereference        treat LINK_NAME as a normal file if
                                it is a symbolic link to a directory
  -P, --physical              make hard links directly to symbolic links
  -r, --relative              create symbolic links relative to link location
  -s, --symbolic              make symbolic links instead of hard links
  -S, --suffix=SUFFIX         override the usual backup suffix
  -t, --target-directory=DIRECTORY  specify the DIRECTORY in which to create
                                the links
  -T, --no-target-directory   treat LINK_NAME as a normal file always
  -v, --verbose               print name of each linked file
      --help     display this help and exit
      --version  output version information and exit

The backup suffix is '~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.
The version control method may be selected via the --backup option or through
the VERSION_CONTROL environment variable.  Here are the values:

  none, off       never make backups (even if --backup is given)
  numbered, t     make numbered backups
  existing, nil   numbered if numbered backups exist, simple otherwise
  simple, never   always make simple backups

Using -s ignores -L and -P.  Otherwise, the last option specified controls
behavior when a TARGET is a symbolic link, defaulting to -P.

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
For complete documentation, run: info coreutils 'ln invocation

在文件系统中链接可以分为两种主要类型:

  • 软链接
  • 硬链接

当默认用ln创建链接时创建的是硬链接,带-s选项表示创建软链接;


软链接

请添加图片描述

软链接是一个符号链接,是一个特殊类型的文件,在文件系统当中存在一个独立的Inode;

其包含指向另一个文件或者目录的路径;

换一种说法就是软链接允许用户创建指向文件或目录的快捷方式从而使得能够通过多个位置来访问一个文件或者是目录;

$ ll -i
total 0
2360201 -rw-rw-r-- 1 _XXX _XXX 0 Jun  4 13:41 log.txt
$ ln -s log.txt soft-link
$ ll -i
total 0
2360201 -rw-rw-r-- 1 _XXX _XXX 0 Jun  4 13:41 log.txt
2360202 lrwxrwxrwx 1 _XXX _XXX 7 Jun  4 13:41 soft-link -> log.txt

软链接的特点如下:

  • 软链接的Inode

    软链接有自己的Inode编号,与目标文件的Inode编号不同故为一个独立的文件;

    软链接的Inode中包含文件类型,权限,所有者,时间戳等元数据,但其数据块指针指向的存储目标文件路径的数据块而不是目标文件的实际数据块;

  • 软链接的数据块

    软链接的数据块存储的是目标文件或目录的路径 (绝对或者相对) ;

    当访问软链接时,操作系统将会读取软链接的数据块从而获取目标文件的路径然后重定向到目标文件;

  • 指向路径

    软链接中存储的是目标文件或目录的路径而不是文件内容本身;

    当访问软链接时操作系统将会自动重定向到目标文件或是目录;

    $ cat log.txt ;cat soft-link 
    $ echo "hello world\n" > soft-link 
    $ cat log.txt ;cat soft-link 
    hello world\n
    hello world\n
    
  • 可以跨文件系统

    软链接可以指向不同文件系统中的文件或是目录,类似指针一样,其存储的是路径信息;

  • 可以指向不存在的文件

    软链接可以指向一个当前不存在的文件或是目录;

    这种链接被称为 “悬挂链接” 或是 “断链” ;

    $ ll -i
    total 0
    2360201 -rw-rw-r-- 1 _XXX _XXX 0 Jun  4 13:53 log.txt
    2360202 lrwxrwxrwx 1 _XXX _XXX 7 Jun  4 13:41 soft-link -> log.txt
    $ rm log.txt 
    $ ll -i
    total 0
    2360202 lrwxrwxrwx 1 _XXX _XXX 7 Jun  4 13:41 soft-link -> log.txt
    

    当删除log.txtsoft-link将标红表示当前为 悬挂链接/断链 ;

  • 权限和大小

    软链接本身有自己的权限和大小,但这些权限通常指影响链接文件本身而不影响目标文件;

    软链接的大小通常是存储的路径长度;


硬链接

请添加图片描述

硬链接是软链接除外的另一种链接类型,允许多个文件名指向同一个文件数据块;

硬链接与源文件共享相同的Inode且并不属于一个单独的文件;

$ ll -i
total 0
2360201 -rw-rw-r-- 1 _XXX _XXX 0 Jun  4 13:59 log.txt
$ ln log.txt hard-link
$ ll -i
total 0
2360201 -rw-rw-r-- 2 _XXX _XXX 0 Jun  4 13:59 hard-link
2360201 -rw-rw-r-- 2 _XXX _XXX 0 Jun  4 13:59 log.txt

换句话说硬链接与目标文件实际上是一个不同名称的同文件,其对应的元信息相同;

硬链接提供了一种在文件系统中创建文件的多个入口点方法;

硬链接的特点如下:

  • 共享Inode

    硬链接与源文件共享相同的Inode编号,因此它们指向同一个数据块;

    任何一个文件在Inode中存在一个引用计数,这个引用计数用来计数当前文件的硬链接数;

    硬链接和源文件在文件系统中是完全等价的,删除任何一个不会影响数据的存在,只有当所有硬链接被删除后数据才会释放;

    $ ll -i
    total 0
    2360201 -rw-rw-r-- 1 _XXX _XXX 0 Jun  4 13:59 log.txt
    $ ln log.txt hard-link
    $ ll -i
    total 0
    2360201 -rw-rw-r-- 2 _XXX _XXX 0 Jun  4 13:59 hard-link
    2360201 -rw-rw-r-- 2 _XXX _XXX 0 Jun  4 13:59 log.txt
    

    该代码中从左至右数第三个字段即为硬链接数,引用计数为1变为2;

  • 不能夸文件系统

    基于Inode相同的理论上;

    硬链接只能在同一个文件系统中创建,不能跨文件系统;

  • 相同的文件属性

    硬链接与目标文件具有相同的Inode,故将会与原文件共享相同的文件属性(如权限,所有者等);

    任何一个硬链接的修改都会影响所有指向统一Inode的硬链接;

  • 不支持目录

    硬链接的创建不支持目录的硬链接,具体原因是避免造成环的问题;

    $ ln todel
    ln: ‘todel’: hard link not allowed for directory
    

    若允许为目录创建硬链接将可能出现以下问题:

    • 例:/usr/home/bin/,此时在bin目录中创建一个指向usr目录的硬链接,即/usr/home/bin/hard-link

      当遍历到目录/usr时,根据路径继续访问/usr/home/bin/hard-link,最终又会回到/usr路径从而导致无限循环;

  • 硬链接的应用场景

    当一个目录被创建时其目录中会默认存在两个目录文件分别为...分别代表当前目录和父目录;

    $ mkdir todel
    $ ls -ai todel/
    2360202 .  2360200 ..
    

    因为目录不被允许创建硬链接,故在设置文件系统时为了方便用户进行访问将设置两个硬链接;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/679799.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

栈的最小值

题目链接 栈的最小值 题目描述 注意点 执行push、pop和min操作的时间复杂度必须为O(1) 解答思路 使用两个栈&#xff0c;一个栈deque存储栈中对应的元素值&#xff0c;另一个栈minDeque存储当前栈中所有元素的最小值&#xff0c;当执行push(int x)操作&#xff0c;deque直…

【乐吾乐3D可视化组态编辑器】数据接入

数据接入 本文为您介绍3D数据接入功能&#xff0c;数据接入功能分为三个步骤&#xff1a;数据订阅、数据集管理、数据绑定 编辑器地址&#xff1a;3D可视化组态 - 乐吾乐Le5le 数据订阅 乐吾乐3D组态数据管理功能由次顶部工具栏中按钮数据管理打开。 在新弹窗中选择数据订阅…

白银票据~

一. 白银票据的原理 白银票据就伪造ST票据&#xff0c; kerberoasting是破解ST票据中的服务用户hash值&#xff0c;有以下区别&#xff1a; 白银票据&#xff1a;伪造的ST使用的是机器用户的Hash值 Kerberoasting:破解的是ST的域用户的hash值二. 白银票据的利用条件 1.域名 …

基于线性回归根据饮食习惯和身体状况估计肥胖水平

目录 1. 作者介绍2&#xff0e;饮食习惯与身体状况数据集介绍3&#xff0e;实验步骤3.1 数据分析3.2 可视化处理数据3.3 导入线性回归模型进行训练3.4 预测结果3.5 完整代码3.5.1 数据分析3.5.2 模型评估 参考文献 1. 作者介绍 刘欢&#xff0c;女&#xff0c;西安工程大学电子…

MySQL经典练习50题(上)(解析版)

所有笔记、生活分享首发于个人博客 想要获得最佳的阅读体验&#xff08;无广告且清爽&#xff09;&#xff0c;请访问本篇笔记 MySQL经典练习50题&#xff08;上&#xff09; 创建数据库和表 -- 建 表 -- 学 生 表 CREATE TABLE Student( s_id VARCHAR(20), s_name VARCHAR(2…

ffmpeg视频编码原理和实战-(2)视频帧的创建和编码packet压缩

源文件&#xff1a; #include <iostream> using namespace std; extern "C" { //指定函数是c语言函数&#xff0c;函数名不包含重载标注 //引用ffmpeg头文件 #include <libavcodec/avcodec.h> } //预处理指令导入库 #pragma comment(lib,"avcodec.…

【linux】swap学习

在 Linux 系统中&#xff0c;swap 是一种用于扩展系统内存的技术。当物理内存&#xff08;RAM&#xff09;不足时&#xff0c;系统会将一部分不常用的内存数据移至 swap 空间&#xff0c;从而释放物理内存供其他程序使用。Swap 空间可以是一个单独的分区&#xff08;swap 分区&…

今日份动态规划学习(二维01背包+01背包变形)

目录 P1877 [HAOI2012] 音量调节 P1877 [HAOI2012] 音量调节 题解&#xff1a;一个入门级别的01背包问题&#xff0c;首先就是为什么能看出是01背包&#xff0c;因为只有两种状态&#xff0c;要不增大音量&#xff0c;要不减小音量&#xff0c;和01背包的选与不选非常近似。但…

学习笔记——IP地址网络协议——IPV4地址配置与应用

五、IPV4地址配置与应用 1、IP地址的基础配置命令 2、案例&#xff1a;配置接口IP地址 3、Loopback接口 Loopback接口∶用户需要一个接口状态永远是Up的接口的IP地址时&#xff0c;可以选择Loopback接口的IP地址。 Loopback接口一旦被创建&#xff0c;其物理状态和链路协议状…

消防认证-饰面型防火涂料

一、消防认证 消防认证是指消防产品符合国家相关技术要求和标准&#xff0c;且通过了国家认证认可监督管理委员会审批&#xff0c;获得消防认证资质的认证机构颁发的证书&#xff0c;消防产品具有完好的防火功能&#xff0c;是住房和城乡建设领域验收的重要指标。 二、认证依据…

【Linux】进程(5):命令行参数

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux进程&#xff08;5&#xff09;&#xff1a;命令行参数&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 &#xff08;A&#xff09;为什么要有命令…

JavaWeb基础(JQuery,XML及解析)

这个阶段有点拖沓了&#xff0c;因为事情比较多&#xff0c;耽搁了一段时间&#xff0c;学习的主要内容为JQuery和XML&#xff0c;因为vue的出现&#xff0c;JQuery技术现在已经不流行了&#xff0c;但是不流行不代表我不会&#xff0c;JQuery最最最最核心的就是他的$()核心函数…

阿里云sls 采集日志安装记录

参考阿里云给的安装文档 阿里云安装Logtail组件 注意这里&#xff0c;选择地域&#xff0c;是中国地域选中国&#xff0c;海外选海外即可 按照文档继续下去 修改配置文件./alibaba-cloud-log-all/values.yaml 所有的操作完成后&#xff0c;去控制台配置 以上操作的前提是…

数据可视化---使用matplotlib绘制高级图表(2)

题目一&#xff1a;绘制人口金字塔图 编写程序。根据第8.6&#xff0c;绘制如下图的人口金字塔图。 运行代码&#xff1a; #绘制人口金字塔图 import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] SimHei plt.rcParams[…

交互式流程图组件DHTMLX Diagram v6.0 - 拥有更灵活的高度可定制功能

DHTMLX Diagram库允许用几行代码构建JavaScript流程图&#xff0c;通过自动布局和实时编辑器&#xff0c;它可以更容易地将复杂数据可视化到一个整洁的层次结构中。 DHTMLX Diagram v6.0版本发布&#xff0c;带来了众多令人兴奋的新功能和改进&#xff0c;使得这个JavaScript图…

【SITS_CC】卫星图像时间序列的变化字幕(IEEE GRSL)

摘要 Satellite images time series (SITS) 提供了一种有效的方法来同时获取地球上观测区域的时间和空间信息。然而&#xff0c;传统的遥感CD方法的输出是二进制图或语义变化图&#xff0c;往往难以被最终用户解释&#xff0c;传统的遥感图像变化字幕方法只能描述双时图像。提…

ARM32开发——串口输出

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 需求串口数据发送串口打印实现复用功能串口发送流程&#xff08;了解&#xff09;串口的标志位关心的内容 需求 串口循环输出内容到…

AI生成PPT:一键式演示文稿制作的秘诀

工欲善其事&#xff0c;必先利其器。 随着AI技术与各个行业或细分场景的深度融合&#xff0c;日常工作可使用的AI工具呈现出井喷式发展的趋势&#xff0c;AI工具的类别也从最初的AI文本生成、AI绘画工具&#xff0c;逐渐扩展到AI思维导图工具、AI流程图工具、AI生成PPT工具、AI…

java 原生http服务器 测试JS前端ajax访问实现跨域传post数据

后端 java eclipse 字节流转字符 package Httpv3;import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer;import java.io.IOException; import java.i…

测试工具链

缺陷管理 bug管理工具 devops---项目管理--缺陷管理 bug管理地址 https://devsecops.mychery.com:8443/chery/project?filterROLE&statusACTIVE bug管理环境 采用公司的devops平台&#xff0c;对每个项目的bug进行管理。目前在使用 接口测试和服务端性能测试 工具…