当前位置: 首页 > news >正文

我写了一个分析 Linux 平台打开文件描述符跨进程传递的工具

Linux 系统的设计中,继承了 Unix “一切皆文件” (Everything is a file) 的思想,系统中的众多对象,都可以表示为文件,可以对它们执行文件操作,如 read()write()mmap()ioctl()close()poll() 等。Linux 系统支持通过 Unix 域 socket 等机制跨进程传递打开的文件描述符。跨进程传递打开的文件描述符,常常用于各种各样的目的,如:

  • 跨进程传递打开的 eventfd,用来做进程间的事件通知。
  • 跨进程传递打开的设备文件的文件描述符。
  • 跨进程传递 memfd,以实现高效的跨进程数据传递。
  • bluez 和系统音频服务器之间,跨进程传递打开的蓝牙 socket。
  • 跨进程传递打开的普通文件。

跨进程传递打开的文件描述符时,不同进程间的文件描述符的数值不一定完全一样,这常常给相关的调试带来障碍。

笔者利用 /proc 虚拟文件系统中导出的 fdinfo 信息,开发了一个分析跨进程打开文件传递的工具 duplicated_fd_in_system.py。对于进程打开的文件描述符,在 /proc/[pid]/fdinfo/ 目录下,有一个对应的文件描述它的基本信息,不同类型的文件,这些信息有一些差异。一些典型的 fdinfo 信息如下:

fdinfo_path:/proc/1960/fdinfo/0, fdinfo:
pos:	0
flags:	0100000
mnt_id:	26
ino:	5fdinfo_path:/proc/1960/fdinfo/1, fdinfo:
pos:	0
flags:	02
mnt_id:	9
ino:	28250
scm_fds: 0fdinfo_path:/proc/1960/fdinfo/2, fdinfo:
pos:	0
flags:	02
mnt_id:	9
ino:	28250
scm_fds: 0fdinfo_path:/proc/1960/fdinfo/4, fdinfo:
pos:	0
flags:	02000002
mnt_id:	16
ino:	2086
tfd:        5 events:       19 data:     564036e84f00  pos:0 ino:826 sdev:f
tfd:        7 events:       19 data:     564036e84f90  pos:0 ino:826 sdev:f
tfd:       53 events:       19 data:     564036ed0ec0  pos:0 ino:16efd sdev:8
tfd:       16 events:       19 data:     564036ea0290  pos:0 ino:826 sdev:f
tfd:       22 events:       19 data:     564036f993f0  pos:0 ino:4e38 sdev:8
tfd:       17 events:       19 data:     564036ea11a0  pos:0 ino:826 sdev:f
tfd:       12 events:       19 data:     564036e917d0  pos:0 ino:826 sdev:f
tfd:        8 events:       19 data:     564036e85000  pos:0 ino:826 sdev:f
tfd:       54 events:       19 data:     564036ea0190  pos:0 ino:1bd65 sdev:8
tfd:       49 events:       19 data:     564037065e20  pos:0 ino:17812 sdev:8
tfd:       31 events:       19 data:     564036f70f90  pos:0 ino:739a sdev:8
tfd:        3 events:       19 data:     564036ea0220  pos:0 ino:8d78 sdev:8
tfd:       32 events:       19 data:     564036f0cc20  pos:0 ino:5f44 sdev:8
tfd:       30 events:       19 data:     564036fe2cd0  pos:0 ino:6782 sdev:8
tfd:       50 events:       19 data:     7fea7381b0a8  pos:0 ino:274 sdev:5
tfd:       29 events:       19 data:     564036ed1880  pos:0 ino:7301 sdev:8
tfd:       18 events:       19 data:     564036ea8a40  pos:0 ino:826 sdev:f
tfd:       20 events:       18 data:     564036eaade0  pos:0 ino:6e6f sdev:8
tfd:       21 events:       19 data:     564036eaae80  pos:0 ino:6e6f sdev:8
tfd:       35 events:       19 data:     564036eccf70  pos:0 ino:6e7a sdev:8
tfd:       34 events:       19 data:     564036ecc6e0  pos:0 ino:6e79 sdev:8
tfd:       52 events:       19 data:     5640370af920  pos:0 ino:12bc3 sdev:8
tfd:       33 events:       19 data:     564036f0ab60  pos:0 ino:77e6 sdev:8fdinfo_path:/proc/1960/fdinfo/5, fdinfo:
pos:	0
flags:	02004002
mnt_id:	16
ino:	2086
eventfd-count:                0
eventfd-id: 175
eventfd-semaphore: 0fdinfo_path:/proc/1960/fdinfo/6, fdinfo:
pos:	0
flags:	02000002
mnt_id:	16
ino:	2086
eventfd-count:                0
eventfd-id: 177
eventfd-semaphore: 1fdinfo_path:/proc/1960/fdinfo/7, fdinfo:
pos:	0
flags:	02004002
mnt_id:	16
ino:	2086
sigmask:	0000000000000002fdinfo_path:/proc/1960/fdinfo/8, fdinfo:
pos:	0
flags:	02004002
mnt_id:	16
ino:	2086
sigmask:	0000000000004000fdinfo_path:/proc/1960/fdinfo/9, fdinfo:
pos:	0
flags:	02000002
mnt_id:	16
ino:	2086
tfd:       10 events:       19 data:     564036e916a0  pos:0 ino:826 sdev:f
tfd:       26 events:       19 data:     564036eb7dd8  pos:0 ino:826 sdev:f
tfd:       23 events:       19 data:     564036eb6648  pos:0 ino:826 sdev:ffdinfo_path:/proc/1960/fdinfo/15, fdinfo:
pos:	0
flags:	02100000
mnt_id:	2601
ino:	79
lock:	1: FLOCK  ADVISORY  WRITE 1960 00:45:79 0 EOFfdinfo_path:/proc/1960/fdinfo/17, fdinfo:
pos:	0
flags:	02004002
mnt_id:	16
ino:	2086
clockid: 1
ticks: 0
settime flags: 00
it_value: (0, 0)
it_interval: (0, 0)

各个文件描述符信息,都包含posflagsmnt_idino 四个字段。在整个 Linux 系统中,对于一般的文件,可以通过挂载点和 inode 号唯一地确定一个文件,在文件描述符信息中,它们分别用 mnt_idino 字段描述。更特殊的文件描述符,包含一些其它字段,eventfd 的包含 eventfd-id 等字段,且它们的 mnt_idino 都是 162086,不同的 eventfd 用 eventfd-id 来区分;UNIX 域 socket 的包含 scm_fds 等字段;timerfd 的包含 clockidticks 等字段;signalfd 的包含 sigmask 等字段;epollfd 的包含 tfd 等字段;inotifyfd 的包含 inotify wd 等字段。

/proc/self/mountinfo 文件中,包含 Linux 系统的文件系统挂载信息,这个文件的内容类似于下面这样:

$ cat /proc/self/mountinfo 
24 29 0:22 / /sys rw,nosuid,nodev,noexec,relatime shared:7 - sysfs sysfs rw
25 29 0:23 / /proc rw,nosuid,nodev,noexec,relatime shared:13 - proc proc rw
26 29 0:5 / /dev rw,nosuid,relatime shared:2 - devtmpfs udev rw,size=20329208k,nr_inodes=5082302,mode=755,inode64
27 26 0:24 / /dev/pts rw,nosuid,noexec,relatime shared:3 - devpts devpts rw,gid=5,mode=620,ptmxmode=000
28 29 0:25 / /run rw,nosuid,nodev,noexec,relatime shared:5 - tmpfs tmpfs rw,size=4073528k,mode=755,inode64
29 1 259:5 / / rw,relatime shared:1 - ext4 /dev/nvme0n1p5 rw,errors=remount-ro
30 24 0:6 / /sys/kernel/security rw,nosuid,nodev,noexec,relatime shared:8 - securityfs securityfs rw
31 26 0:26 / /dev/shm rw,nosuid,nodev shared:4 - tmpfs tmpfs rw,inode64
32 28 0:27 / /run/lock rw,nosuid,nodev,noexec,relatime shared:6 - tmpfs tmpfs rw,size=5120k,inode64
33 24 0:28 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime shared:9 - cgroup2 cgroup2 rw,nsdelegate,memory_recursiveprot
34 24 0:29 / /sys/fs/pstore rw,nosuid,nodev,noexec,relatime shared:10 - pstore pstore rw
35 24 0:30 / /sys/firmware/efi/efivars rw,nosuid,nodev,noexec,relatime shared:11 - efivarfs efivarfs rw
36 24 0:31 / /sys/fs/bpf rw,nosuid,nodev,noexec,relatime shared:12 - bpf bpf rw,mode=700
37 25 0:32 / /proc/sys/fs/binfmt_misc rw,relatime shared:14 - autofs systemd-1 rw,fd=29,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=32794
38 26 0:33 / /dev/hugepages rw,relatime shared:15 - hugetlbfs hugetlbfs rw,pagesize=2M
39 26 0:20 / /dev/mqueue rw,nosuid,nodev,noexec,relatime shared:16 - mqueue mqueue rw
40 24 0:7 / /sys/kernel/debug rw,nosuid,nodev,noexec,relatime shared:17 - debugfs debugfs rw
41 24 0:12 / /sys/kernel/tracing rw,nosuid,nodev,noexec,relatime shared:18 - tracefs tracefs rw
42 24 0:34 / /sys/fs/fuse/connections rw,nosuid,nodev,noexec,relatime shared:19 - fusectl fusectl rw
43 24 0:21 / /sys/kernel/config rw,nosuid,nodev,noexec,relatime shared:20 - configfs configfs rw
66 28 0:35 / /run/credentials/systemd-sysusers.service ro,nosuid,nodev,noexec,relatime shared:21 - ramfs ramfs rw,mode=700
44 28 0:36 / /run/qemu rw,nosuid,nodev,relatime shared:22 - tmpfs tmpfs rw,mode=755,inode64
45 29 7:0 / /snap/bare/5 ro,nodev,relatime shared:23 - squashfs /dev/loop0 ro,errors=continue,threads=single
46 29 7:1 / /snap/core18/2846 ro,nodev,relatime shared:24 - squashfs /dev/loop1 ro,errors=continue,threads=single
47 29 7:2 / /snap/core18/2855 ro,nodev,relatime shared:25 - squashfs /dev/loop2 ro,errors=continue,threads=single
48 29 7:4 / /snap/core20/2501 ro,nodev,relatime shared:26 - squashfs /dev/loop4 ro,errors=continue,threads=single
49 29 7:3 / /snap/core20/2496 ro,nodev,relatime shared:27 - squashfs /dev/loop3 ro,errors=continue,threads=single
51 29 7:6 / /snap/core22/1908 ro,nodev,relatime shared:29 - squashfs /dev/loop6 ro,errors=continue,threads=single
53 29 7:8 / /snap/firefox/6042 ro,nodev,relatime shared:31 - squashfs /dev/loop8 ro,errors=continue,threads=single
54 29 7:9 / /snap/gnome-3-38-2004/112 ro,nodev,relatime shared:32 - squashfs /dev/loop9 ro,errors=continue,threads=single
55 29 7:10 / /snap/gnome-3-38-2004/143 ro,nodev,relatime shared:33 - squashfs /dev/loop10 ro,errors=continue,threads=single
56 29 7:12 / /snap/gnome-42-2204/202 ro,nodev,relatime shared:34 - squashfs /dev/loop12 ro,errors=continue,threads=single
57 29 7:11 / /snap/gnome-42-2204/176 ro,nodev,relatime shared:35 - squashfs /dev/loop11 ro,errors=continue,threads=single
58 29 7:13 / /snap/gtk-common-themes/1535 ro,nodev,relatime shared:36 - squashfs /dev/loop13 ro,errors=continue,threads=single
59 29 7:15 / /snap/pycharm-community/465 ro,nodev,relatime shared:37 - squashfs /dev/loop15 ro,errors=continue,threads=single
61 29 7:17 / /snap/snap-store/1216 ro,nodev,relatime shared:39 - squashfs /dev/loop17 ro,errors=continue,threads=single
62 29 7:16 / /snap/snap-store/1113 ro,nodev,relatime shared:40 - squashfs /dev/loop16 ro,errors=continue,threads=single
64 29 7:19 / /snap/snapd/23771 ro,nodev,relatime shared:42 - squashfs /dev/loop19 ro,errors=continue,threads=single
65 29 7:20 / /snap/snapd-desktop-integration/247 ro,nodev,relatime shared:43 - squashfs /dev/loop20 ro,errors=continue,threads=single
67 29 259:5 /usr/share/hunspell /var/snap/firefox/common/host-hunspell ro,noexec,noatime shared:1 - ext4 /dev/nvme0n1p5 rw,errors=remount-ro
159 29 7:21 / /snap/snapd-desktop-integration/253 ro,nodev,relatime shared:44 - squashfs /dev/loop21 ro,errors=continue,threads=single
163 29 259:13 / /media/data rw,relatime shared:55 - ext4 /dev/nvme1n1p2 rw
166 29 259:6 / /home rw,relatime shared:94 - ext4 /dev/nvme0n1p6 rw
169 29 259:10 / /media/data2 rw,relatime shared:96 - ext4 /dev/nvme0n1p10 rw
172 29 259:2 / /boot/efi rw,relatime shared:98 - vfat /dev/nvme0n1p2 rw,fmask=0077,dmask=0077,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro
175 37 0:37 / /proc/sys/fs/binfmt_misc rw,nosuid,nodev,noexec,relatime shared:100 - binfmt_misc binfmt_misc rw
1982 28 0:25 /snapd/ns /run/snapd/ns rw,nosuid,nodev,noexec,relatime - tmpfs tmpfs rw,size=4073528k,mode=755,inode64
2601 28 0:69 / /run/user/1000 rw,nosuid,nodev,relatime shared:1105 - tmpfs tmpfs rw,size=4073524k,nr_inodes=1018381,mode=700,uid=1000,gid=1000,inode64
2640 2601 0:70 / /run/user/1000/gvfs rw,nosuid,nodev,relatime shared:1167 - fuse.gvfsd-fuse gvfsd-fuse rw,user_id=1000,group_id=1000
2679 2601 0:71 / /run/user/1000/doc rw,nosuid,nodev,relatime shared:1187 - fuse.portal portal rw,user_id=1000,group_id=1000
3359 1982 0:4 mnt:[4026532459] /run/snapd/ns/snap-store.mnt rw - nsfs nsfs rw
1528 29 7:22 / /snap/firefox/6073 ro,nodev,relatime shared:718 - squashfs /dev/loop22 ro,errors=continue,threads=single
4011 1982 0:4 mnt:[4026532936] /run/snapd/ns/firefox.mnt rw - nsfs nsfs rw
52 29 259:8 / /media/hanpfei/649E63CF9E6397F6 rw,nosuid,nodev,relatime shared:30 - ntfs3 /dev/nvme0n1p8 rw,uid=1000,gid=1000,windows_names,iocharset=utf8
4836 29 7:7 / /snap/pycharm-community/471 ro,nodev,relatime shared:917 - squashfs /dev/loop7 ro,errors=continue,threads=single
60 29 7:14 / /snap/snapd/24505 ro,nodev,relatime shared:38 - squashfs /dev/loop14 ro,errors=continue,threads=single
63 29 7:18 / /snap/core22/1963 ro,nodev,relatime shared:41 - squashfs /dev/loop18 ro,errors=continue,threads=single

/proc/self/mountinfo 文件的格式如下:

<mount_id> <parent_id> <major:minor> <root> <mount_point> <options> <optional_fields> <filesystem_type> <source> <super_options>

/proc/self/mountinfo 文件中的 shared 字段可以简单理解为 mount_id 的别名。根据 fdinfo 信息中的 mnt_id/proc/self/mountinfo 文件中的信息,可以找到文件的挂载点。

duplicated_fd_in_system.py 工具的设计思路大概为:

  1. 加载各个进程打开文件的 fdinfo 信息,fdinfo 信息用字典保存,不同类型的文件,其 fdinfo 信息的字典字段不完全一样。各个打开文件的 fdinfo 信息,用一个以文件描述符为 key 的字典保存。所有打开文件的 fdinfo 信息和进程的其它信息,如进程名,用一个字调保存。
  2. 为这些打开的文件描述符的 fdinfo 信息建立索引,其中包含文件的类型、mount_idino 及不同文件类型特有的一些信息,如 eventfd 的 eventfd-id 等,创建一个以该索引为键,数组为值的字典,数组的元素为进程 ID 和文件描述符组成的元组。
  3. 检查 fdinfo 信息索引,输出进程间共享的打开文件描述符。

duplicated_fd_in_system.py 工具对于分析 eventfd 的跨进程传递比较有效,其它一些文件类型,可能很少有跨进程传递的需要,如 epollfd 等,只能提供一些提示性信息。

duplicated_fd_in_system.py 工具的更多详细信息,可以参考其源码。

欢迎各位朋友帮忙给 Gitee 的 Repo star,感谢感谢。

Done.

相关文章:

我写了一个分析 Linux 平台打开文件描述符跨进程传递的工具

Linux 系统的设计中&#xff0c;继承了 Unix “一切皆文件” (Everything is a file) 的思想&#xff0c;系统中的众多对象&#xff0c;都可以表示为文件&#xff0c;可以对它们执行文件操作&#xff0c;如 read()、write()、mmap()、ioctl()、close() 和 poll() 等。Linux 系统…...

QML图像提供器 (Image Provider)

QML 中的图像提供器是一种自定义图像加载机制&#xff0c;允许你从非文件源&#xff08;如数据库、网络或程序生成的内容&#xff09;提供图像数据。 主要类型 QQuickImageProvider - 基础图像提供器 QPixmapImageProvider - 提供 QPixmap 图像 QImageImageProvider - 提供 …...

【Java学习】通配符?

面向对象系列八&#xff1a;泛型(二) 一、通配符? 二、泛型符<> 1.泛型类里 2.泛型类外 2.1使用过程中 2.2使用最后末 三、限制 1.泛型类里的限制 2.延申处的限制 2.1extend限制上界 2.1.1返回值接 2.1.2形参传 2.2super限制下界 2.2.1形参传 2.2.2返回值…...

安卓基础(悬浮窗和摄像)

ACTION_MANAGE_OVERLAY_PERMISSION​​ 的作用就是 ​​打开系统设置的「悬浮窗权限管理页面」 Intent intent new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" getPackageName()) ); startActivity(intent); 直接跳转目标应用的权限…...

一种实波束前视扫描雷达目标二维定位方法——论文阅读

一种实波束前视扫描雷达目标二维定位方法 1. 专利的研究目标与实际问题意义2. 专利提出的新方法、模型与公式2.1 运动平台几何建模与回波信号构建2.1.1 距离历史建模2.1.2 回波信号模型2.2 距离向运动补偿技术2.2.1 匹配滤波与距离压缩2.3 加权最小二乘目标函数2.3.1 方位向信号…...

基于springboot的金院银行厅预约系统的设计及实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;信息管理系统的实施在技术上已逐步成熟。信息管理系统是一个不断发展的新型学科&#xff0c;任何一个单位要生存要发展&#xff0c;要高效率地把内部活动有机地组织起来&#xff0c;就必须建立与自身特点相适应的…...

AVFormatContext 再分析零

随着对于AVFormatContext 各个参数的学习&#xff0c;逐渐可以从 整体架构上 再认识一下 AVFormatContext 了。 还是从解封装的第一步开始。 int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options); 实际上…...

【学习心得】魔塔(ModelScope)和抱抱脸(Hugging Face)下载模型小细节

介绍常用的两种在模型社区如魔塔&#xff08;ModelScope&#xff09;和抱抱脸&#xff08;Hugging Face&#xff09;&#xff0c;下载预训练模型的方法&#xff0c;然后说明各种方法里面的小细节。 一、SDK下载 对于希望直接通过编程方式集成模型下载功能到自己的项目中的开发…...

嵌入式硬件篇---STM32 系列单片机型号命名规则

文章目录 前言一、STM32 型号命名规则二、具体型号解析1. STM32F103C8T6F103:C:8:T6:典型应用2. STM32F103RCT6F103:R:C:T6:典型应用三、命名规则扩展1. 引脚数与封装代码2. Flash 容量代码3. 温度范围代码四、快速识别技巧性能定位:F1/F4后缀差异硬件设计参考:引脚数…...

关于算法设计与分析——拆分表交换问题

题目&#xff1a; 用蛮力法设计一个算法&#xff0c;将A{a1, a2, ..., an}拆成B和C两个表&#xff0c;使A中值大于等于0的元素存入表B&#xff0c;值小于0的元素存入表C&#xff0c;要求表B和C不另外设置存储空间而利用表A的空间。 1&#xff09;问题分析 题目要求设计一个算…...

在pycharm profession 2020.3上离线安装.whl类型的包(以PySimpleGUI为例)

今天写个小代码&#xff0c;用到了PySimpleGUI。 在pycharm profession 2020.3的项目中的Terminal里运行如下代码即可安装。 python3 -m pip install --force-reinstall --extra-index-url https://PySimpleGUI.net/install PySimpleGUI 安装方法如图&#xff1a; 安装后使用…...

c++回调函数

函数指针 //函数 bool lengthCompare(const string&, const string&); //pf为指针&#xff0c;指向一个函数&#xff0c;函数的类型为&#xff1a;bool (const string&, const string&) bool (*pf)(const string&, const string&); //函数&#xff0…...

mysql主从复制搭建,并基于‌Keepalived + VIP实现高可用

以下是基于 ‌Keepalived VIP‌ 实现 MySQL 主从复制高可用的详细步骤&#xff0c;涵盖主从复制搭建与故障自动切换&#xff1a; 一、MySQL 主从复制搭建&#xff08;基础步骤回顾&#xff09; 1. ‌主库&#xff08;Master&#xff09;配置‌ 修改配置文件‌ /etc/my.cnf&…...

时间交织(TIADC)的失配误差校正处理(以4片1GSPS采样率的12bitADC交织为例讲解)

待写…有空再写&#xff0c;有需要的留言。 存在失配误差的4GSPS交织 校正完成后的4GSPS交织...

K8S自动弹性伸缩机制详解

Kubernetes (K8S) 自动弹性伸缩机制详解 Kubernetes 通过多种控制器和指标系统实现 自动弹性伸缩&#xff0c;主要包括 Pod水平伸缩&#xff08;HPA&#xff09;、垂直伸缩&#xff08;VPA&#xff09;、集群节点伸缩&#xff08;CA&#xff09; 三种方式。以下是核心机制和实…...

C++模版结构体的使用

1. convert_pointer 结构体模板 template<typename _SourceIterator, typename _DestT> struct convert_pointer {typedef typename convert_pointer<typename _SourceIterator::pointer, _DestT>::type type; };作用 这是一个递归模板&#xff0c;用于处理 _Sou…...

WebRTC 服务器之Janus架构分析

1. Webrtc三种类型通信架构 1.1 1 对 1 通信 1 对 1 通信模型设计的主要⽬标是尽量让两个终端进⾏直联&#xff0c;这样即可以节省服务器的资源&#xff0c;⼜可以提⾼ ⾳视频的服务质量。WebRTC ⾸先尝试两个终端之间是否可以通过 P2P 直接进⾏通信&#xff0c;如果⽆法直接…...

音视频开发成长之路与音视频知识总结

音视频开发曾经是一个富有挑战性和技术深度的领域。我来分享整理音视频开发的成长路径和知识体系&#xff1a; 音视频开发成长路线图 1. 基础阶段&#xff08;1-3个月&#xff09; 计算机基础&#xff1a;C/C、数据结构、操作系统音视频基础概念&#xff1a;采样率、比特率、…...

batch normalization和layer normalization区别

Normalization无非就是这样一个操作&#xff1a; 其中x是输入数据&#xff0c;维度为&#xff08;B&#xff0c;T&#xff0c;C&#xff09;&#xff0c;其中B是batchsize&#xff0c;T是序列长度&#xff0c;C是embedding维度&#xff1b;括号内是标准化操作&#xff0c;γ和…...

Android Compose 层叠布局(ZStack、Surface)源码深度剖析(14)

Android Compose 层叠布局&#xff08;ZStack、Surface&#xff09;源码深度剖析 一、引言 在 Android 应用开发领域&#xff0c;用户界面&#xff08;UI&#xff09;的设计与实现一直是至关重要的环节。随着技术的不断演进&#xff0c;Android Compose 作为一种全新的声明式…...

数据仓库方法论书籍及其阅读建议

A、关于数据仓库方法论的各书籍详细分析及汇总 1. ​​《Building the Data Warehouse (Third Edition)》 by W.H. Inmon​ 核心观点 ​企业级数据仓库&#xff08;EDW&#xff09;​​&#xff1a;自上而下的架构&#xff0c;采用第三范式&#xff08;3NF&#xff09;模型&…...

数据库 1.0

数据库就是放数据的地方 程序里面的数据就是暂时性的 要是想把数据永久性的储存 MySQL是典型的C / S架构 Client 云端 Sever 服务端 数据库服务的开启和关闭 可以在这里选择关闭开启&#xff0c;关闭之后就无法通过终端再连接mysql了 通过命令行的方式开启和关闭mysql&…...

给QCustomPlot添加一个QScrollBar滚动条、限制缩放范围、自动设置大小和右边栏垂直缩放

实现效果 实现思路 从QCustomPlot类派生一个类,进行个性化设置,在轴矩形的上边设置Margin,放一个滚动条,设置滚动条的样式 常量定义 #define NQSCRB 1000构造函数初始化 // 设置QScrollBar的样式// 顶部空--5,左侧空--6...

计算机系统结构 第二章 :缓存优化

零-1:复习cache的基础知识: 一、映像方式 直接映射 原理&#xff1a;主存被分成若干区&#xff0c;每个区大小与 Cache 相同&#xff0c;区内再分块&#xff0c;主存每个区中块的大小和 Cache 中块大小相等&#xff0c;且每个区包含的块数也与 Cache 中块数相等。主存中任意…...

软件工程实践

例一 用例文档 UC1注册 执行者 潜在会员 前置条件 潜在会员访问系统 后置条件 系统已记录注册信息 涉众利益 潜在会员——希望注册尽量简单&#xff0c;希望自己的信息不会泄露 商店——希望获得尽可能多的未来客户信息&#xff0c;特别是联系方法 基本路径 1.潜在会员请求注册…...

将Airtable导入NocoDB

将Airtable导入NocoDB 0. 前提条件1. 详细步骤 NocoDB提供了一种简化流程&#xff0c;可在几分钟内将您的Airtable数据库无缝转移到各种数据库管理系统&#xff0c;包括MySQL、Postgres和SQLite。此功能特别适合希望将Airtable数据库迁移到更强大且可扩展的数据库管理系统中的用…...

【云备份】服务端数据管理模块设计与实现

目录 一、要管理的数据 二、如何管理数据 三.数据管理类的设计 3.1.数据信息结构体的设计 3.2.数据管理类的设计 四.数据管理类实现 4.1.数据信息结构体的数据填充 4.2.数据管理类的实现 五. 源代码测试 数据管理模块&#xff1a;需要管理的数据有哪些&#xff0c;而…...

Qt开发:按钮类的介绍和使用

文章目录 一、命令按钮类 &#xff08;QPushButton&#xff09;1.1 基本功能介绍1.2 常用构造函数1.3 常用方法1.4 信号与槽使用示例1.5 开关按钮&#xff08;Checkable&#xff09;1.6 创建出菜单按钮&#xff08;Menu Button&#xff09; 二、工具按钮类 &#xff08;QToolBu…...

Clickhouse基于breakpad生成minidump文件,方便问题定位

背景 breakpad能够在程序崩溃的时候自动生成一个mini的core文件&#xff0c;能够帮助进行问题定位&#xff0c;但是clickhouse对于集成breappad的难度较大 查看github发现之前有大佬基于以前的分支有个MR&#xff0c;但是一直没有合并到社区&#xff0c;想来是有什么其他的原因…...

华为云Astro轻应用自定义连接器对接OBS云对象存储操作指南

操作难点图例(详细见下文详细操作步骤) 操作成功图例 说明:以下是通过自定义连接器创建新的OBS桶的图例 说明:以下是通过自定义连接器将数据内容嵌入创建新的OBS桶的图例 操作难点图例 说明:连接器编排需要注意的是动作选择、输入参数的设置等...

C# 运算符重载深度解析:从基础到高阶实践

运算符重载是 C# 中一项强大的特性&#xff0c;它允许开发者为用户自定义类型定义运算符的行为&#xff0c;使得代码更直观、更符合领域逻辑。本文将通过理论解析与实战示例&#xff0c;全面讲解运算符重载的实现规则、适用场景及注意事项。 一、运算符重载的核心概念 1. 什么…...

面试现场“震”情百态:HashMap扩容记

&#xff08;以下为符合要求的文章内容&#xff09; 【场景】 2024年秋招季某互联网大厂会议室 面试官&#xff1a;张工&#xff08;P8级架构师&#xff09; 求职者&#xff1a;马小帅&#xff08;双非二本应届生&#xff09; 第一轮提问&#xff08;Java基础篇&#xff09; …...

SCAU18124--N皇后问题

18124 N皇后问题 时间限制:5000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC Description 有N*N的国际象棋棋盘&#xff0c;要求在上面放N个皇后&#xff0c;要求任意两个皇后不会互杀&#xff0c;有多少种不同的放法&#xff1f; 输入格式 …...

MySQL 分库分表

对于使用 MySQL 作为数据库管理系统的应用来说&#xff0c;当数据量达到一定规模时&#xff0c;单库单表的架构会面临性能瓶颈&#xff0c;如查询缓慢、写入性能下降等问题。为了解决这些问题&#xff0c;可以使用分库分表技术。 二、为什么需要分库分表 2.1 单库单表的局限性…...

滑动窗口leetcode 904

代码&#xff1a; class Solution { public:int totalFruit(vector<int>& fruits) {int n fruits.size();unordered_map<int,int> window_type_count;int left 0;int ans 0;for(int right 0; right <n;right){while(window_type_count.size() 2 &&…...

用Maven定位和解决依赖冲突

用Maven定位和解决依赖冲突 一、依赖冲突的常见表现二、定位冲突依赖的4种方法2.1 使用Maven命令分析依赖树2.2 使用IDE可视化工具2.3 使用Maven Enforcer插件2.4 运行时分析 三、解决依赖冲突的5种方案3.1 排除特定传递依赖3.2 统一指定版本&#xff08;推荐&#xff09;3.3 使…...

八大排序之选择排序

本篇文章将带你详细了解八大基本排序中的选择排序 目录 &#xff08;一&#xff09;选择排序的时间复杂度和空间复杂度及稳定性分析 &#xff08;二&#xff09;代码实现 (三)输出结果 选择排序的基本原理是&#xff1a;每次从待排序的数组中找出最大值和最小值。具体流程是…...

SVM实战:从理论到鸢尾花数据集的分类可视化

SVM实战&#xff1a;从理论到鸢尾花数据集的分类可视化 在机器学习的广阔领域中&#xff0c;支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;作为一种经典且强大的分类算法&#xff0c;备受瞩目。它凭借独特的思想和卓越的性能&#xff0c;在模式识…...

深入解析 Stacking:集成学习的“超级英雄联盟

在机器学习的世界里&#xff0c;我们常常面临一个挑战&#xff1a;单一模型往往难以完美地解决复杂问题。就像漫威电影中的超级英雄们一样&#xff0c;每个模型都有自己的独特能力&#xff0c;但也有局限性。那么&#xff0c;如何让这些模型“联手”发挥更大的力量呢&#xff1…...

C# 编程核心:控制流与方法调用详解

在编程中&#xff0c;控制流和方法调用是构建程序逻辑的两大基石。它们决定了代码的执行顺序和模块化协作方式。本文将从基础概念出发&#xff0c;结合代码示例&#xff0c;深入解析这两部分内容。 控制流&#xff1a;程序执行的指挥棒 控制流决定了代码的执行路径&#xff0…...

PyTorch_张量基本运算

基本运算中&#xff0c;包括add, sub, mul, div, neg等函数&#xff0c;以及这些函数的带下划线的版本add_, sub_, mul_, div_, neg_, 其中带下划线的版本为修改原数据。 代码 import torch import numpy as np # 不修改原数据的计算 def test01():data torch.randint(0, 10…...

C++负载均衡远程调用学习之订阅功能与发布功能

目录 1.lars-DnsV0.1回顾 2.Lars-DnsV0.2-订阅功能的订阅模块分析 3.Lars-DnsV0.2-订阅模块的类的单例创建及方法属性初始化 4.Lars-DnsV0.2-发布功能的实现 5.Lars-DnsV0.2-发布功能的总结 6.Lars-DnsV0.2-订阅流程复习 7.Lars-DnsV0.2-订阅模块的集成 8.Lars-DnsV0.2订…...

接口测试的核心思维(基础篇)

1.为什么会进行接口测试&#xff1f; 早期发现问题&#xff0c;降低修复成本 当我们服务端已经完成&#xff0c;而前端还未进行开发的时候。我们可以通过接口测试避免前端的交互直接进行服务端的测试。 接口测试也能够更早介入项目的测试&#xff0c;降低修复成本。 提高测试…...

给文件内容加行号

题目&#xff1a; 给定一个文件&#xff0c;通过文件读写&#xff0c;给文件内容加行号。 行号形式如: 1:) xxXXXX 2:) xxxxXX 要求&#xff1a; 使用缓冲流操作。 思路分析&#xff1a; 程序定义了两个字符串变量 inputFile 和 outputFile&#xff0c;分别存储输入文件的路径…...

【计算机视觉】三维重建: MVSNet:基于深度学习的多视图立体视觉重建框架

MVSNet&#xff1a;基于深度学习的多视图立体视觉重建框架 技术架构与核心算法1. 算法流程2. 关键创新 环境配置与实战指南硬件要求安装步骤数据准备&#xff08;DTU数据集&#xff09; 实战流程1. 模型训练2. 深度图推断3. 点云生成 常见问题与解决方案1. CUDA内存不足2. 特征…...

终端与环境变量

一、我的电脑是Win10的&#xff0c;首先打开终端如下&#xff1a; 此时终端来到C:\Users\lenovo的目录下&#xff0c;可以访问该目录下的所有文件&#xff08;夹&#xff09;。另外&#xff0c;除了这个之外&#xff0c;终端还可以访问环境变量中的所有文件&#xff08;夹&…...

使用线性表实现通讯录管理

目录 &#x1f680;前言&#x1f99c;任务目标&#x1f31f;顺序表实现&#x1f40d;链表实现 &#x1f680;前言 大家好&#xff01;我是 EnigmaCoder。 本文介绍线性表的实验&#xff0c;使用顺序表和链表实现通讯录管理&#xff0c;包含初始化、插入、删除、查询、输出。 &a…...

机器学习常用评价指标

1. 指标说明 (1) AccuracyClassification&#xff08;准确率&#xff09; • 计算方式&#xff1a;accuracy_score(y_true, y_pred) • 作用&#xff1a; 衡量模型正确预测的样本比例&#xff08;包括所有类别&#xff09;。 公式&#xff1a; Accuracy TP TN TP TN FP…...

基于ArduinoIDE的任意型号单片机 + GPS北斗BDS卫星定位

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.1 器件选择1.2 接线方案 二、驱动实现2.1 核心代码解析&#xff08;arduino/ESP32-S3&#xff09; 三、坐标解析代码四、典型问题排查总结 前言 北斗卫星导航…...

CGAL:创建点、线、三角形及其距离、关系

CGAL&#xff08;Computational Geometry Algorithms Library&#xff0c;计算几何算法库&#xff09;是一个强大的开源库&#xff0c;为众多几何计算问题提供了高效的解决方案&#xff0c;在计算几何领域应用广泛。以下将基于提供的代码示例&#xff0c;详细介绍如何利用 CGAL…...