01 介绍 在 Golang 语言中,我们可以使用反单引号为 Struct 中的字段设置 Tag,通过 Tag 可以为 Struct 中的字段定义附加属性。...示例代码: type User struct { Id uint64 `json:"id"` Name string `json:"name"` } 02 操作 Struct 字段中的...在 reflect 包中,使用一个 StructField 表示 Struct 中的一个字段。...中的一个字段的组成部分,Tag 的类型是 StructTag,实际上它是一个 string 类型的别名。...03 总结 本文我们介绍了 Struct 字段中的 Tag 是什么,同时介绍了如何使用标准库 reflect 包操作 Struct 字段中的 Tag,实际上 Tag 只是一个字符串,reflect 包可以通过
大家好,又见面了,我是你们的朋友全栈君。 在 linux 中,经常需要获取文件的属性,比如修改时间,文件大小等等。stat 函数将会帮助我们得到这些信息。...1 stat 函数 1.1 stat 函数的作用 linux 中,可以使用 stat 函数来获取文件相关的信息,就比如说文件的大小,文件的类型等等。...1.2 struct stat 结构体 stat 函数将获取到的结果保存到一个名为 struct stat 的结构体中。...函数原型 int stat(const char *pathname, struct stat *buf); stat 函数的第一个参数是目标文件的路径。...参考 3.1 中的文件查找流程,stat 可以很容易的从 inode 结构体中获取。比如 st_mode 字段来源于 inode 的 i_mode 字段等等。
前面的关于ps中的%CPU的含义一文已经介绍了CPU占用率的含义,那么为什么有时会在ps的输出中看到CPU占用率超出%100的现象呢?...在fs/proc/array.c中定义了下面两个函数 int proc_tgid_stat(struct task_struct *task, char *buffer) { return do_task_stat...的代码就知道这个参数的含义了: static int do_task_stat(struct task_struct *task, char *buffer, int whole) { ....这样就可以解释为什么%CPU字段有超过100%了,因为分子是这个进程(线程组)中所有线程运行的时间,而在同一时刻,同一线程组中的两个不同线程可能在两个不同的CPU上运行,这样总的运行时间就有可能超过物理上真正过去的时间...执行ps aux时是按进程输出的,但是如果这个进程中还有其他线程,它的stat字段有一个l, 比如firefox [root@localhost 3013]# ps aux|grep firefox-bin
每个 CPU 的使用情况通过 cpu_usage_stat 结构来记录,我们来看看其定义: struct cpu_usage_stat { cputime64_t user; cputime64...nice 值大于0,那么将会增加到 CPU 统计结构的 nice 字段中。...irq 字段中。...如果当前处于软中断执行上下文,那么增加到 CPU 统计结构的 softirq 字段中。 否则增加到 CPU 统计结构的 system 字段中。...,那么增加到 CPU 统计结构的 iowait 字段中。
在数据库中,除了数据表外,还有一个重要对象叫视图。视图是由SQL语句将不同字段从不同表中抽取或者构造后形成的新表,跟数据库表不同在于,它不存储在磁盘上,而是在使用时临时构建出来。...统计信息一般包含当前有多少条记录,字段在磁盘中的分布信息等,这些数据在引擎执行查询时用于估计成本,统计信息处理的好能大大加快查询速度。...如果是商用数据库,这些信息将会多如牛毛,我们这里简单起见就保持三种数据即可,他们分别是每个表使用了多少区块,每个表包含了多少条记录,对于某个表中的某个字段,它有多少个不重复的值。...我们看看统计元数据的实现,在当前目录增加一个文件名为stat_manager.go,实现代码如下: package metadata_manager import ( rm "record_manager...最后我们使用一个名为MetaDataManager的对象将前面实现的所有Manager统一管理起来,在目录中创建meta_manager.go实现代码如下: package metadata_manager
内核的各个子系统已经有大量的跟踪点,如果这些跟踪点无法满足工作中的需求,可以自己手动添加跟踪点。 添加跟踪点有两种方式,一种是仿照events/目录下的跟踪点,使用TRACE_EVENT() 宏添加。...首先,需要在include/trace/events/timer.h头文件种添加名为timer_stat的跟踪点。...proto:表示跟踪点调用的入参的原型,比如timer类型为struct timer_list *。 args:表示参数。 struct:定义跟踪器内部使用的__entry数据结构。...assign:把参数复制到__entry数据结构中。 print:定义输出的格式。...重新编译内核后,烧写到设备中,即可看到sys节点已经有了新增的跟踪点。
lstat:获取链接文件的信息,无穿透能力 函数原型 int stat(const char *pathname,struct stat *buf); int lstat(const char *pathname...,struct stat buf); 参数一:文件路径 参数二:用于存放文件信息的结构体(struct stat) struct stat { dev_t st_dev; / ID of device...st_blocks; / number of 512B blocks allocated */ mode_t st_mode; /* protection */ 文件属性 S_IFMT 0170000 文件类型位字段的位掩码.../main filepath { //获取文件的信息 //int stat(const char *path, struct stat *buf); //struct stat *buf;...struct stat st;//存放文件信息的结构体 int ret = stat(argv[1],&st); // int ret = lstat(argv[1],&st
第三章 目录与文件属性:编写ls 磁盘上有文件和目录,文件和目录都有目录和属性.文件的内容可以是任意的数据, 目录的内容只能是文件名或者子目录名的属性 目录中的文件名和子目录名指向文件和其他的目录,内核提供了系统调用来读取目录的...内容,读取和修改文件的属性 文件类型,文件的访问权限和特殊属性被编码存储在一个16位整数中,可以通过 掩码技术来读取这些信息 文件所有者和组信息是以ID的形式保存的,它们与用户名和组名的联系保存在 passwd...和group数据库中 自己编写ls,需要掌握三点: 如何读取目录的内容 如何读取并显示文件的属性 给出一个名字,如何判断是目录还是文件 把多种信息编码到不同的字段是一种常用的技术,如电话号码,IP字段等...为了比较,把不需要的地方置为0,这种技术称为掩码 将二进制数的每三位分为一组来操作,这就是八进制 结构stat 中的st_mode 成员包含16位,其中四位用作文件类型,九位用作许可权限, 剩下的三位用作文件特殊属性...> void do_ls(char []); void dostat(char *); void show_file_info(char *, struct stat *); void mode_to_letters
关于fileinfo结构体源码中已经给了很好的注释,其中struct stat类型的变量stat具体描述了文件的信息,往往由stat()或lstat()函数返回。...struct stat类型的定义可以在Linux源码include\uapi\asm-generic中找到,可以看出新版本64位中与常见文档中相比增加了许多pad填充,并将类型的一些宏定义取消了,直接采用了...115 unsigned short i_opflags;//2.6内核中没有的字段,哪里去找这个字段注释?...inode索引节点对象的getattr方法,再用generic_fillattr填充到返回的stat中,stat->mode=inode->i_mode。...如下图所示,符号链接inode中的mode值确实为0120777。这会不会有什么安全隐患,为什么要这样设计? ?
Conn_stat *p = (struct Conn_stat*)shm; memcpy(p,&stat,sizeof(struct Conn_stat)); //修改共享内存中的数据...length:将文件中多大的部分映射到内存。 prot:映射区域的保护方式。...fd: 要映射到内存中的文件描述符。 如果使用匿名内存映射时,即flags中设置了MAP_ANONYMOUS,fd设为-1。...相关参考: 认真分析mmap:是什么 为什么 怎么用 ---- munmap 作用:解除映射。...< 0){ perror("open"); exit(2); } struct Conn_stat stat; //注意与写中的参数不同 struct Conn_stat *
Slab是一个或者多个连续页组成的内存空间,那么本质上指向一个Slab的数据结构不是别的,就是struct page *,对应Slab中的信息可以通过第一个page的某些字段描述。...,申请和释放对象都需要经过该结构操作,部分重要字段如下: /* * Slab cache management. */ struct kmem_cache { struct...为什么叫做node?其实这是NUMA系统中的node概念。NUMA是为了多核优化而产生的架构,可以令某个CPU访问某段内存的速度更快。...frozen slabs */ #endif #ifdef CONFIG_SLUB_STATS unsigned stat[NR_SLUB_STAT_ITEMS]; #endif...个数 通过lru字段索引链表中的下一个/前一个page 前三点没什么好说的,大家都差不多。
它们用于查询文件或目录的元数据,返回一个 struct stat 结构,结构中包含了该文件的详细信息。 这三个函数的区别在于它们如何访问文件,特别是在涉及符号链接(symlinks)时的行为。...buf:指向一个 struct stat 结构体,该结构体将被填充上文件的状态信息。 成功:返回 0,并将文件的状态信息存储到 buf 中。...结构体 这三个函数都将文件的状态信息存储到 struct stat 结构体中。...常见的字段如下: struct stat { dev_t st_dev; // 设备ID ino_t st_ino; // inode号 mode_t...为什么需要缓冲区 在计算机系统中,数据的读写速度通常是不均衡的: CPU 的处理速度 远快于 磁盘 I/O 和 网络 I/O。 内存访问速度 远快于 硬盘读写速度。
Slab是一个或者多个连续页组成的内存空间,那么本质上指向一个Slab的数据结构不是别的,就是struct page *,对应Slab中的信息可以通过第一个page的某些字段描述。...为什么叫做node?其实这是NUMA系统中的node概念。NUMA是为了多核优化而产生的架构,可以令某个CPU访问某段内存的速度更快。...个数 通过lru字段索引链表中的下一个/前一个page 前三点没什么好说的,大家都差不多。...需要关注的是第四点,这里不像cpu partial那样通过next指针连接页表,而是通过lru字段: struct page { ... /* * Third double word...案例2:CVE-2018-9568(WrongZone)漏洞利用 这里不涉及漏洞的详细细节,只需要知道这个漏洞的核心是类型混淆,即Slab-A中分配的对象,错误地用Slab-B进行了释放(这也是为什么这个漏洞名为
字段nlink统计引用此inode的目录条目数,以便识别何时应释放磁盘上的inode及其数据块。 字段size记录文件中内容的字节数。 addrs数组记录保存文件内容的磁盘块的块号。...ref字段统计引用内存中inode的C指针的数量,如果引用计数降至零,内核将从内存中丢弃该inode: // in-memory copy of an inode struct inode { uint...struct { struct spinlock lock; struct inode inode[NINODE]; } icache; 每个内存中的inode都有一个包含睡眠锁的lock字段,...最后,每个inode都包含一个nlink字段(在磁盘上,如果已缓存则复制到内存中),该字段统计引用文件的目录项的数量;如果inode的链接计数大于零,xv6将不会释放inode。...网络文件系统和用户级文件系统提供了将这些调用转换为网络RPC并在返回之前等待响应的函数。---- 练习 为什么要在balloc中panic?xv6可以恢复吗? 为什么要在ialloc中panic?
共享内存指 (shared memory)在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存。...设定共享内存字段在系统的存储地址。...这里并未从系统中删除标识符,该标识符一直存在直至某个进程带IPC_RMID命令调用shmctl特地删除它为止。...IPC_STAT 将与shmid关联的内核数据结构中的信息复制到buf所指向的shmid_ds结构中。...(This information * can be used with repeated SHM_STAT or SHM_STAT_ANY operations * to obtain information
,但是 pt_regs 结构有个字段 orig_ax 存放了原始的 syscall id,从这可以获取到。...处理 stat 系统调用相关代码:static __inline int handle_enter_stat(struct bpf_raw_tracepoint_args *ctx){ struct...程序时使用上面两个函数进行内存消费的计算,可以看到,计算占用内存的字段是位于 user_struct 的 locked_vm 字段,而 user_struct 实际上内核代表用户 credential...结构 struct cred 的 user 字段:struct cred { //......如图:图片但是如上文所述中, 利用 eBPF 的手法却不会促使操作系统自动更新目录的 st_mtime,所以我们需要编写 eBPF 代码 attach stat 的 syscall,促使 Cron 进程误以为
$size$ 用来条件检查的,这里为什么使用二级指针请看前文 系统调用 int argstr(int n, char **pp); 从用户栈中获取第 $n$ 个参数字符串(地址值),放在 $*pp$ 里...,为什么使用二级指针同样看前文。...$fstat$ ①函数原型: int fstat(int fd, struct stat*); $fstat$ 用来获取文件信息,也就是 $inode$ 中记录的文件属性,类似的函数还有 $stat$,...stati(struct inode *ip, struct stat *st) //将inode中记录的信息搬到stat结构体中 { st->dev = ip->dev; st->ino =...,最后将这些信息放到 $stat$ 结构体中。
访问文件时,是用底层的open系统调用接口,它访问文件需要用到文件描述符,在C语言中,我们访问文件用的是FILE而不是文件描述符,因此可以推测出,FILE中必定有一个文件描述符的字段。...2.理解 为什么文件描述符是0,1,2,3……这些整数?它的本质是什么? 文件描述符的本质是数组的下标。...OS为了管理被打开的文件,构造了struct file结构体用来描述被打开的文件,为了管理进程与文件之间的联系,进程创建了struct file_struct结构,里面包含了struct file* fd_array...[]指针数组,它存储了描述被打开文件的结构体对象的地址,将进程对应的struct file_struct对象存放在进程的PCB中。...重定向的本质就是,上层使用的fd不变,在内核中修改了fd对应的struct_file*的地址。
系统中每个节点被链接到一个以NULL结尾的pgdat_list链表中,而其中的每个节点利用pg_data_tnode_next字段链接到下一节.而对于PC这种UMA结构的机器来说, 只使用了一个成为contig_page_data...任何种类的数据页都可以存放在任页框中, 没有任何限制. 但是Linux内核又把各个物理内存节点分成个不同的管理区域zone, 这是为什么呢?...高速缓冲分为行, 每一行负责不同的内存区.内核使用ZONE_PADDING宏生成”填充”字段添加到结构中, 以确保每个自旋锁处于自身的缓存行中 ZONE_PADDING宏定义在include/linux...ZONE_FAIR_DEPLETED 公平区策略耗尽(没懂) 4.4 内存域统计信息vm_stat 内存域struct zone的vm_stat维护了大量有关该内存域的统计信息....per_cpu_pageset具有一个字段, 该字段 struct per_cpu_pages则维护了链表中目前已有的一系列页面, 高极值和低极值决定了何时填充该集合或者释放一批页面, 变量决定了一个块中应该分配多少个页面
一、读取文件元数据 int stat(const char *path, struct stat *buf); int fstat(int fd, struct stat *buf); int lstat...(const char *path, struct stat *buf); stat() stats the file pointed to by path and fills in buf....二、stat结构体 struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; ...:regular file File permission bits=664 -rw-rw-r-- 因为是普通文件,故从st_dev字段看设备号,而不是st_rdev. ...主设备号表示设备驱动程序,而次设备号表示特定的子设备。比如在同一个磁盘上面不同的文件系统,设备驱动程序相当,但是次设备号不同。
领取专属 10元无门槛券
手把手带您无忧上云