12 readdir 函数

news2024/11/19 17:27:43

前言

在之前 ls 命令 中我们可以看到, ls 命令的执行也是依赖于 opendir, readdir, stat, lstat 等相关操作系统提供的相关系统调用来处理业务 

因此 我们这里来进一步看一下 更细节的这些 系统调用 

我们这里关注的是 readdir 这个函数, 入口系统调用是 getdents 

如下调试基于命令 "ls -l /jerry"

如下调试基于 linux 4.10

readdir 的词条 

getdents 

封装 getdents_callback, 然后 迭代 f 中的各个文件, getdents_callback 中藏有回调 

将数据最终存放于 buf 中 

ext4_dx_readdir

如下图 第一个 if block 为填充 info 用于迭代, 大致的工作是 将当前文件夹下的各个文件的相关信息填充到 info.root 中

然后 后面的处理为 迭代 info.root 的整棵树, 然后调用 call_filldir 来填充各个文件的信息, call_filldir 中会委托调用上面的 getdents_callback.ctx.actor 

htree_dirblock_to_tree

如下会 迭代 dir 中的各个文件, 然后调用 ext4_htree_store_dirent 将各个文件的信息放到 info.root 中

ext4_htree_store_dirent 

复制给定的文件的相关信息到 info.root 

这个 info.root 是基于 file->private_data 进行传输的, 具体的外面处理是在 ext4_dx_readdir 函数中

这里是 获取当前节点的 hash, minor_hash, inode, name, name_len, file_type 封装到 fname 中, 然后插入到 info.root[红黑树], 根据 hash, minor_hash 进行排序 

关于这个顺序, 我们待会儿会有一个 case 来论证

call_filldir

接着来到外部 ext4_dx_readdir 中, 迭代目录中的各个文件信息, 调用回调填充 数据到 buf

filldir 

调用 filldir 向 buf.current_dir 中填充当前 dir 的各个文件信息 

这个 buf.current_dir 是从参数传入的一个 用户空间的 dirent, 因此 这里使用了 __put_user 函数 

这里向 dirent 中填充了 inode_no, record_len, d->name, 0[字符串结束符], file_type, offset 等相关信息 

我们来看一下 填充之后的相关信息 

内存中的数据 可以对号入座一下, 这里 省略 

(gdb) x /30bc 0xaa3a40
0xaa3a40:	18 '\022'	0 '\000'	0 '\000'	0 '\000'	0 '\000'	0 '\000'	0 '\000'	0 '\000'
0xaa3a48:	0 '\000'	0 '\000'	0 '\000'	0 '\000'	0 '\000'	0 '\000'	0 '\000'	0 '\000'
0xaa3a50:	32 ' '	0 '\000'	84 'T'	101 'e'	115 's'	116 't'	48 '0'	50 '2'
0xaa3a58:	77 'M'	97 'a'	108 'l'	108 'l'	111 'o'	99 'c'

确认一下 Test02Malloc 的 inode_no, 确实是 18 

(initramfs) ls -ail /jerry/
     29 -rwxr-xr-x    1      8912 Test19UdpClient02
     32 -rw-r--r--    1       860 Test19UdpServer.c
     21 -rw-r--r--    1      1036 Test05SocketClient.c
     12 -rw-r--r--    1         7 1.txt
     35 -rw-r--r--    1         2 4.txt
     16 -rwxr-xr-x    1    913944 Test01SumStatic
     22 -rwxr-xr-x    1      9232 Test05SocketServer
     14 -rwxr-xr-x    1      9784 Test01Sum
     11 drwx------    2     12288 lost+found
      2 drwxr-xr-x    3      1024 .
     25 -rw-r--r--    1      2213 Test18UdpClient.c
     30 -rw-r--r--    1       790 Test19UdpClient.c
     28 -rwxr-xr-x    1      8912 Test19UdpClient
     24 -rwxr-xr-x    1     13656 Test18UdpClient
     13 -rwxr-xr-x    1     44168 ping
     23 -rw-r--r--    1      1839 Test05SocketServer.c
     34 -rw-r--r--    1         2 3.txt
     17 -rw-r--r--    1      8828 Test01Sum.txt
     19 -rw-r--r--    1       112 Test02Malloc.c
     36 -rw-r--r--    1         0 2.xml
      1 drwxr-xr-x   18         0 ..
     33 -rw-r--r--    1         2 2.txt
     31 -rwxr-xr-x    1      9008 Test19UdpServer
     20 -rwxr-xr-x    1      9208 Test05SocketClient
     15 -rw-r--r--    1       127 Test01Sum.c
     27 -rw-r--r--    1      2139 Test18UdpServer.c
     26 -rwxr-xr-x    1     13656 Test18UdpServer
     18 -rwxr-xr-x    1      9898 Test02Malloc
(initramfs) 

回顾一下 ls 中的使用

使用的是 系统调用获取到的 file_type, file_name, inode_no 等等 

readdir 中获取的文件顺序

如下 摘录出 /jerry 中各个文件, 以及其 hash 

然后根据 hash 进行排序, 输出各个文件的顺序, 我们比较一下 和 "ls -l /jerry" 的顺序的一下关系, 联系 

/**
 * Test13ResolveFileAndHash
 *
 * @author Jerry.X.He <970655147@qq.com>
 * @version 1.0
 * @date 2022-08-06 10:58
 */
public class Test13ResolveFileAndHash {

    // Test13ResolveFileAndHash
    public static void main(String[] args) {

        String lines = "(gdb) printf \"%s %ld\", ent_name->name, hash\n" +
                ". 2361201130\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=1798131950, minor_hash=3795156168, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "(gdb) printf \"%s %ld\", ent_name->name, hash\n" +
                ".. 1798131950\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=2638309314, minor_hash=220112255, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "(gdb) printf \"%s %ld\", ent_name->name, hash\n" +
                "lost+found 2638309314\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=4147007512, minor_hash=1467808689, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "(gdb) printf \"%s %ld\", ent_name->name, hash\n" +
                "1.txt 4147007512\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=2218817754, minor_hash=2900089684, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "(gdb) printf \"%s %ld\", ent_name->name, hash\n" +
                "ping\u000E 2218817754\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=2722591116, minor_hash=3228507950, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "(gdb) printf \"%s %ld\", ent_name->name, hash\n" +
                "Test01Sum 2722591116\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=582633220, minor_hash=3262287479, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "(gdb) printf \"%s %ld\", ent_name->name, hash\n" +
                "Test01Sum.c 582633220\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=3631608018, minor_hash=2725415301, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "(gdb) printf \"%s %ld\", ent_name->name, hash\n" +
                "Test01SumStatic 3631608018\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=2142992528, minor_hash=928223017, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "(gdb) printf \"%s %ld\", ent_name->name, hash\n" +
                "Test01Sum.txt 2142992528\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=220227180, minor_hash=2471538305, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "(gdb) printf \"%s %ld\", ent_name->name, hash\n" +
                "Test02Malloc\u0013 220227180\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=1840751322, minor_hash=137392396, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "(gdb) printf \"%s %ld\", ent_name->name, hash\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=857331192, minor_hash=434642936, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "Test05SocketClient 857331192\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=4158704484, minor_hash=312643960, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "Test05SocketClient.c\u0016 4158704484\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=3462659828, minor_hash=2883930437, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "Test05SocketServer 3462659828\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=2205009970, minor_hash=314116339, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "Test05SocketServer.c\u0018 2205009970\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=2263127060, minor_hash=2266183803, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "Test18UdpClient 2263127060\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=2342703042, minor_hash=2944388140, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "Test18UdpClient.c 2342703042\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=428460190, minor_hash=2134201002, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "Test18UdpServer 428460190\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=493987328, minor_hash=2169830099, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "Test18UdpServer.c 493987328\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=2302229242, minor_hash=322069301, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "Test19UdpClient 2302229242\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=4262479554, minor_hash=1848801320, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "Test19UdpClient02 4262479554\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=2304662458, minor_hash=1793028086, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "Test19UdpClient.c 2304662458\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=888054094, minor_hash=304564512, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "Test19UdpServer 888054094\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=4198063328, minor_hash=3673609025, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "Test19UdpServer.c 4198063328\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=1673380854, minor_hash=394531314, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "2.txt 1673380854\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=2170292718, minor_hash=758117636, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "3.txt 2170292718\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=4053642864, minor_hash=2642363966, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "4.txt 4053642864\n" +
                "Breakpoint 6, ext4_htree_store_dirent (dir_file=<optimized out>, hash=1832402012, minor_hash=2399099147, dirent=<optimized out>, ent_name=0xffffc9000074bcb8) at fs/ext4/dir.c:459\n" +
                "459\t\tnew_fn->name[ent_name->len] = 0;\n" +
                "2.xml 1832402012 \n";

        Map<Long, String> hash2FileName = new TreeMap<>();
        for (String line : lines.split("\n")) {
            if (line.contains("ext4_htree_store_dirent")) {
                continue;
            }
            if (line.contains("new_fn->name")) {
                continue;
            }
            if (line.contains("printf")) {
                continue;
            }

//            System.out.println(line);
            String[] splits = line.split("\\s+");
            hash2FileName.put(Long.parseLong(splits[1]), splits[0]);
        }

        for (Map.Entry<Long, String> entry : hash2FileName.entrySet()) {
            System.out.println(entry.getValue());
        }

    }

}

文件顺序如下, 呵呵 是不是和 "ls -l /jerry" 的顺序差不多, 只是顺序是反的 

从 readdir 中读取的文件的顺序和 上面的 Test13ResolveFileAndHash 的顺序一致, 那就是 外围的 ls 的处理可能导致的这个顺序上的差异 

类似于 coreutils 中 ls 是有 根据文件名排序, 根据扩展名排序, 根据文件大小排序, 根据版本排序, 根据时间排序

只是 qemu虚拟机中的 ls 的排序 是另外一种排序, 并且有一些 奇怪 

Test02Malloc
Test18UdpServer
Test18UdpServer.c
Test01Sum.c
Test05SocketClient
Test19UdpServer
2.txt
..
2.xml
Test01Sum.txt
3.txt
Test05SocketServer.c
ping
Test18UdpClient
Test19UdpClient
Test19UdpClient.c
Test18UdpClient.c
.
lost+found
Test01Sum
Test05SocketServer
Test01SumStatic
4.txt
1.txt
Test05SocketClient.c
Test19UdpServer.c
Test19UdpClient02

readdir 的顺序, 抽样前两个 

 

"ls -ail /jerry" 的顺序

(initramfs) ls -ail /jerry
     29 -rwxr-xr-x    1      8912 Test19UdpClient02
     32 -rw-r--r--    1       860 Test19UdpServer.c
     21 -rw-r--r--    1      1036 Test05SocketClient.c
     12 -rw-r--r--    1         7 1.txt
     35 -rw-r--r--    1         2 4.txt
     16 -rwxr-xr-x    1    913944 Test01SumStatic
     22 -rwxr-xr-x    1      9232 Test05SocketServer
     14 -rwxr-xr-x    1      9784 Test01Sum
     11 drwx------    2     12288 lost+found
      2 drwxr-xr-x    3      1024 .
     25 -rw-r--r--    1      2213 Test18UdpClient.c
     30 -rw-r--r--    1       790 Test19UdpClient.c
     28 -rwxr-xr-x    1      8912 Test19UdpClient
     24 -rwxr-xr-x    1     13656 Test18UdpClient
     13 -rwxr-xr-x    1     44168 ping
     23 -rw-r--r--    1      1839 Test05SocketServer.c
     34 -rw-r--r--    1         2 3.txt
     17 -rw-r--r--    1      8828 Test01Sum.txt
     19 -rw-r--r--    1       112 Test02Malloc.c
     36 -rw-r--r--    1         0 2.xml
      1 drwxr-xr-x   18         0 ..
     33 -rw-r--r--    1         2 2.txt
     31 -rwxr-xr-x    1      9008 Test19UdpServer
     20 -rwxr-xr-x    1      9208 Test05SocketClient
     15 -rw-r--r--    1       127 Test01Sum.c
     27 -rw-r--r--    1      2139 Test18UdpServer.c
     26 -rwxr-xr-x    1     13656 Test18UdpServer
     18 -rwxr-xr-x    1      9898 Test02Malloc

调试虚拟机 ls 命令帮助文档如下 

(initramfs) ls -help
ls: invalid option -- 'h'
BusyBox v1.22.1 (Ubuntu 1:1.22.0-15ubuntu1) multi-call binary.

Usage: ls [-1AaCxdLHFplins] [FILE]...

List directory contents

	-1	One column output
	-a	Include entries which start with .
	-A	Like -a, but exclude . and ..
	-C	List by columns
	-x	List by lines
	-d	List directory entries instead of contents
	-L	Follow symlinks
	-H	Follow symlinks on command line
	-p	Append / to dir entries
	-F	Append indicator (one of */=@|) to entries
	-l	Long listing format
	-i	List inode numbers
	-n	List numeric UIDs and GIDs instead of names
	-s	List allocated blocks

呵呵 从宿主机 ubuntu 拿到的顺序又不一样 

root@ubuntu:/jerryDisk/linux-4.10.14# ls -ail images/share/
total 1075
     2 drwxr-xr-x 3 root root   1024 May  4 00:57 .
414752 drwxr-xr-x 5 root root   4096 May  4 00:58 ..
    12 -rw-r--r-- 1 root root      7 May  4 00:57 1.txt
    33 -rw-r--r-- 1 root root      2 Jul 30 19:03 2.txt
    36 -rw-r--r-- 1 root root      0 Jul 30 20:13 2.xml
    34 -rw-r--r-- 1 root root      2 Jul 30 19:03 3.txt
    35 -rw-r--r-- 1 root root      2 Jul 30 19:03 4.txt
    14 -rwxr-xr-x 1 root root   9784 May  4 00:57 Test01Sum
    15 -rw-r--r-- 1 root root    127 May  4 00:57 Test01Sum.c
    17 -rw-r--r-- 1 root root   8828 May  4 00:57 Test01Sum.txt
    16 -rwxr-xr-x 1 root root 913944 May  4 00:57 Test01SumStatic
    18 -rwxr-xr-x 1 root root   9898 Jul 30 19:05 Test02Malloc
    19 -rw-r--r-- 1 root root    112 May  4 00:57 Test02Malloc.c
    20 -rwxr-xr-x 1 root root   9208 May  4 00:57 Test05SocketClient
    21 -rw-r--r-- 1 root root   1036 May  4 00:57 Test05SocketClient.c
    22 -rwxr-xr-x 1 root root   9232 May  4 00:57 Test05SocketServer
    23 -rw-r--r-- 1 root root   1839 May  4 00:57 Test05SocketServer.c
    24 -rwxr-xr-x 1 root root  13656 May  4 00:57 Test18UdpClient
    25 -rw-r--r-- 1 root root   2213 May  4 00:57 Test18UdpClient.c
    26 -rwxr-xr-x 1 root root  13656 May  4 00:57 Test18UdpServer
    27 -rw-r--r-- 1 root root   2139 May  4 00:57 Test18UdpServer.c
    28 -rwxr-xr-x 1 root root   8912 May  4 00:57 Test19UdpClient
    30 -rw-r--r-- 1 root root    790 May  4 00:57 Test19UdpClient.c
    29 -rwxr-xr-x 1 root root   8912 May  4 00:57 Test19UdpClient02
    31 -rwxr-xr-x 1 root root   9008 May  4 00:57 Test19UdpServer
    32 -rw-r--r-- 1 root root    860 May  4 00:57 Test19UdpServer.c
    11 drwx------ 2 root root  12288 May  4 00:56 lost+found
    13 -rwxr-xr-x 1 root root  44168 May  4 00:57 ping

上面提到的 hash 的计算方式存在于 hash.ext4fs_dirhash 中

readdir/ls 中的文件顺序关联的问题?

可以关联到如下问题中的 "WebappClassloader 如何加载 ?", 它的类加载顺序 依赖于 File.list 

40 classpath中存在多个jar存在同限定名的class classloader会如何加载_蓝风9的博客-CSDN博客_xbootclasspath 多个jar

File.list 实现来自于 FileSystem.list 

其实现 也取决于 readdir 相关具体的实现 

完 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HDMI协议介绍(六)--EDID

目录 什么是EDID EDID结构 1)Header Information 头信息(厂商信息、EDID 版本等) (2)Basic Display Parameters and Features 基本显示参数(数字/模拟接口、屏幕尺寸、格式支持等) (3)色度信息 (4)Established Timings(VESA 定义的电脑使用 Timings) (5)Standard Timing…

并发编程——synchronized优化原理

如果有兴趣了解更多相关内容&#xff0c;欢迎来我的个人网站看看&#xff1a;耶瞳空间 一&#xff1a;基本概念 使用synchronized实现线程同步&#xff0c;即加锁&#xff0c;实现的是悲观锁。加锁可以使一段代码在同一时间只有一个线程可以访问&#xff0c;在增加安全性的同…

Python基础知识——字符串、字典

字符串 在Python中&#xff0c;字符和字符串没有区别。可能有些同学学过其他的语言&#xff0c;例如Java&#xff0c;在Java中&#xff0c;单引号’a’表示字符’a’&#xff0c;双引号"abc"表示字符串"abc"&#xff0c;但在Python当中&#xff0c;它们没…

【百日百题-C语言-1】KY15、45、59、72、101、132

本节目录1、KY15 abc2、KY45 skew数3、KY59 神奇的口袋4、KY72 Digital Roots5、KY115 后缀子串排序6、KY132 xxx定律 3n1思想7、KY168 字符串内排序1、KY15 abc #include<stdio.h> int main() {int a,b,c;for(a1;a<9;a)for(b1;b<9;b)for(c0;c<9;c){int xa*100 …

【macOS软件】iThoughtsX 9.3 思维导图软件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。应用介绍iThoughtsX可以帮助您直观组织想法、主意和信息。亮点使用大部分常用桌面应用程序格式来进行导入导出MindManageriMindmapFreemind/FreeplaneNovamindXMindMindviewConceptDrawOPML (OmniOutliner, Scrivener etc.)…

CornerNet介绍

CornerNet: Detecting Objects as Paired Keypoints ECCV 2018 Paper&#xff1a;https://arxiv.org/pdf/1808.01244v2.pdf Code&#xff1a;GitHub - princeton-vl/CornerNet 摘要&#xff1a; 提出了一种single-stage的目标检测算法CornerNet&#xff0c;它把每个目标检…

Vector - CAPL - 获取相对时间函数

在自动化开发中&#xff0c;无论是CAN通信测试&#xff0c;还是网络管理测试&#xff0c;亦或是休眠唤醒等等存在时间相关的&#xff0c;都可能会使用相关的时间函数&#xff1b;今天主要介绍的就是获取当前时间&#xff0c;我们知道vector工具的最大优势就是稳定和精确度高&am…

Windows使用QEMU搭建arm64 ubuntu 环境

1. 下载 QEMU&#xff1a; https://qemu.weilnetz.de/w64/ QEMU UEFI固件文件&#xff1a; https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd arm64 Ubuntu镜像&#xff1a; http://cdimage.ubuntu.com/releases/20.04.3/rel…

docker-compsoe启动nginx

本次采用的是nginx:1.20版本 下载命令 docker pull nginx:1.20docker-compose.yml version: 3 services: nginx:restart: always image: nginx:1.20container_name: nginx1.20ports:- 80:80volumes: - /home/nginx-docker/nginx.conf:/etc/nginx/nginx.conf- /home/nginx-do…

【mysql是怎样运行的】-InnoDB数据页结构

文章目录1. 数据库的存储结构&#xff1a;页1.1 磁盘与内存交互基本单位&#xff1a;页1.2 页结构概述1.3 页的上层结构2. 页的内部结构2.1 第1部分&#xff1a;文件头部和文件尾部2.1.1 File Header&#xff08;文件头部&#xff09;&#xff08;38字节&#xff09;2.1.2 File…

时序预测 | MATLAB实现IWOA-BiLSTM和BiLSTM时间序列预测(改进的鲸鱼算法优化双向长短期记忆神经网络)

时序预测 | MATLAB实现IWOA-BiLSTM和BiLSTM时间序列预测(改进的鲸鱼算法优化双向长短期记忆神经网络) 目录时序预测 | MATLAB实现IWOA-BiLSTM和BiLSTM时间序列预测(改进的鲸鱼算法优化双向长短期记忆神经网络)预测效果基本介绍程序设计参考资料预测效果 基本介绍 MATLAB实现IWO…

[1.3_3]计算机系统概述——系统调用

文章目录第一章 计算机系统概述系统调用&#xff08;一&#xff09;什么是系统调用&#xff0c;有何作用&#xff08;二&#xff09;系统调用与库函数的区别&#xff08;三&#xff09;小例子&#xff1a;为什么系统调用是必须的&#xff08;四&#xff09;什么功能要用到系统调…

Spring——整合junit4、junit5使用方法

spring需要创建spring容器&#xff0c;每次创建容器单元测试是测试单元代码junit4依赖<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-i…

【mysql是怎样运行的】-InnoDB行格式

文章目录1 指定行格式的语法2 COMPACT行格式2.1 变长字段长度列表2.2 NULL值列表2.3 记录头信息&#xff08;5字节&#xff09;2.4 记录的真实数据3 Dynamic和Compressed行格式1 指定行格式的语法 CREATE TABLE 表名 (列的信息) ROW_FORMAT行格式名称ALTER TABLE 表名 ROW_FOR…

Java面试题总结

文章目录前言1、JDK1.8 的新特性有哪些&#xff1f;2、JDK 和 JRE 有什么区别&#xff1f;3、String&#xff0c;StringBuilder&#xff0c;StringBuffer 三者的区别&#xff1f;4、为什么 String 拼接的效率低&#xff1f;5、ArrayList 和 LinkedList 有哪些区别&#xff1f;6…

Trace、Metrics、Logging 选型

背景分布式追踪的起源自从微服务的兴起开始&#xff0c;整个系统架构开始变得极为庞大和复杂&#xff0c;但是服务之间的调用关系&#xff0c;调用消耗时间等等信息却依然是半黑盒的状态。为了能够将调用的链路进行串联&#xff0c;将系统的各种指标数据展示出来以使得系统的链…

windows 服务程序和桌面程序集成(一)

本系列文章介绍如何将windows服务程序和桌面程序集成在一起&#xff0c;也就是说一个EXE程序&#xff0c;既可以作为服务程序运行&#xff0c;也可以作为桌面程序运行的双模程序。在十几年前&#xff0c;曾经给客户开发一套C/S架构的出单程序&#xff0c;当时不是很清楚windows…

C++016-C++结构体

文章目录C016-C结构体结构体目标结构体定义结构体实例化结构体题目描述在线练习&#xff1a;总结C016-C结构体 在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 结构体 参考&#xff1a;https://www.cnblogs.com/ybqjymy/p/16561657.html https://…

【Day1】一小时入门 python 基础,从安装到入门

文章目录python安装安装python安装 pycharmpython基础输出注释变量输入类型转换运算符自增字符串相关操作比较运算符逻辑运算符条件控制while循环list 列表for 循环range函数元组python 安装 安装python 官网进行下载&#xff1a;官网下载地址这里下载的一直是最新版本的 点…

嵌入式linux必备内存泄露检测神器

Valgrind介绍 Valgrind是一个可移植的动态二进制分析工具集&#xff0c;主要用于发现程序中的内存泄漏、不合法内存访问、使用未初始化的内存、不正确的内存释放以及性能问题等&#xff0c;可在Linux和Mac OS X等平台上使用。 Valgrind由多个工具组成&#xff0c;其中最常用的…