自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(592)
  • 收藏
  • 关注

原创 C++14:通过make_index_sequence实现将tuple转换为array

需要说明的是,array中的元素是同一类型,因此需要tuple中的元素都支持转换为首元素类型。通过该方法,可以把tuple中的元素转换为tuple首元素类型的array。如何将vector转换为array呢。

2024-10-01 10:03:31 61

原创 nlohmann json:读写json文件

的方式是当读取的文件无法匹配json的格式时不抛出异常。3. j.is_discarded()用于判断是否正确的读取到了json内容。

2024-09-25 23:01:05 153

原创 Linux开发:ELF中的段和节的区别

也就是说节是程序在编译后,分类划分的一些区域,用于保存代码的就是代码节(.text),保存已初始化的全局数据的就是全局数据节(.data),保存只读数据的就是只读数据节(.data),保存未初始化的全局数据的就是.bss,节的分类比较细致,实际的程序中有很多节。其实节的概念就是我们常说的段,是根据不同功能组织的分类,比如:代码段(节),全局数据段(节),只读数据段(节),.bss段(节)...[号] 名称 类型 地址 偏移量。

2024-09-08 12:08:23 124

原创 Linux工具:objdump

4.显示某段的具体信息:objdump --section=.data -s file_path。./c_symbol: 文件格式 elf64-x86-64。./c_symbol: 文件格式 elf64-x86-64。5.显示动态符号表信息:objdump -T file_path。1.查看符号表信息:objdump -t file_path。./c: 文件格式 elf64-x86-64。./c: 文件格式 elf64-x86-64。

2024-09-07 12:52:09 90

原创 Linux工具:readelf

类型: DYN (Position-Independent Executable file)0x0000000000000001 (NEEDED) 共享库:[libstdc++.so.6]0x0000000000000001 (NEEDED) 共享库:[libc.so.6]Elf 文件类型为 DYN (Position-Independent Executable file)

2024-09-07 12:20:07 121

原创 GDB:加载符号表

如:strip --strip-debug --strip-unneeded c。介绍了调试coredump时需要通过-g编译程序,从而产生调试程序所需要的信息。如:objcopy --only-keep-debug c c_symbol。通过这种方式可以将符号表文件c_symbol 加回到可执行文件c。c_symbol: 文件格式 elf64-x86-64。c: 文件格式 elf64-x86-64。如:objcopy --strip-all c。可以看到又可以看到有意义的符号信息了。

2024-09-06 22:37:20 666

原创 GDB:调试加载coredump文件

C/C++语言,程序编写不当,就会产生coredump,可以通过gdb进行调试,快速定位coredump的位置。使用两种方式均可以正确的加载core文件,通过以下方式可以快速的定位coredump。可以看到对空指针d进行复制,导致了coreddump。运行程序后,不出所料参数了coredump。可以通过两种方式加载core文件。

2024-09-06 22:07:52 68

原创 Windows工具:tracert探测路由

用法: tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout]-j host-list 与主机列表一起的松散源路由(仅适用于 IPv4)。4 * * * 请求超时。7 * * * 请求超时。9 * * * 请求超时。10 * * * 请求超时。

2024-09-02 23:12:29 376

原创 Linux工具:traceroute探测路由

其工作原理是:主机试图以最小的TTL存活时间(初次为1,后续依次增加)发出探测包,探索包经过路由器时,会将存活时间就会减1,当其存活时间为0时, 路由器会取消探测包的转发,并传送一个ICMP报文给源主机,并会在ICMP报文里包含路由器的IP,这样源主机就会获取依次所需经历的路由设备IP。-m, --max-hop=NUM 设置检测数据包的最大存活数值TTL的大小(default: 64)-g, --gateways=GATES 设置来源路由网关,最多可设置8个。

2024-09-02 23:02:25 517

原创 网络:通过ipv6打开网页

但是由于Linux没有default zone这种概念,所以目前在Linux下,通过浏览器是无法打开link-local网站的。比如:http://[FC00:0000:130F:0000:0000:09C0:876A:130B]但是目前的浏览器都没有支持这种做法,所以实际上无法访问ipv6的link-local网站。http://[fe80::1111:2222]这种方式打开link-local网站。但是%在url中具有特殊的含义,所以需要进行转义为%25,也就是。

2024-09-01 18:13:44 713

原创 网络:IPv6

3.3ipv6的link-local地址,类似于ipv4的169.254.0.0/16,169.254.x.x地址通常用于当DHCP无法使用时,主机给自己分配的地址,这样可以保证在同一子网下的主机还能正常的通信。FF02:0:0:0:0:1:FFXX:XXXX ,Solicited-Node组播地址。FF02:0:0:0:0:0:0:6,所有OSPF的DR路由器组播地址。FF02:0:0:0:0:0:0:5,所有OSPF路由器组播地址。FF02:0:0:0:0:0:0:D,所有PIM路由器组播地址。

2024-09-01 17:02:47 1032

原创 GDB:调试时传递参数

1.运行gdb时通过--args传递参数。2.在gdb中执行run的时候传递参数。3.在run之前通过set传递参数。可以看到参数传递到了程序中。同样参数传递到了程序中。

2024-08-24 20:36:32 253

原创 Linux开发:通过readlink读取软连接指向的文件

读取软连接后,保存在buf中的路径的长度,如果返回值长度与bufsiz相等,则代表buf的长度不够,发生了截断。如果输入参数pathname不是软连接,则返回0。buf:保存软连接指向路径的缓存。pathname:软连接的路径。bufsiz:buf缓存的大小。注:该函数不会自动在buf后面补0。可以看到读取到了连接指向的实际路径。

2024-08-24 20:14:29 77

原创 C++(23):新的错误返回机制expected

4.调用函数时返回的expected值,如果转bool后为true,代表函数正确的执行了,可以通过类似*result或result.value()获取到返回值。5.如果函数执行错误了,那么可以通过result.error()返回错误对象,比如DivE,继而通过错误对象得到错误值result.error().err。2.expected的第二个模版参数DivE代表的是函数执行错误时的类型,可以是原生类型也可以是自定义类型。传统的C++程序,有的时候既想要知道函数是否正确的执行了,又想要知道返回的结果。

2024-07-28 21:54:32 259

原创 C++(20):存储utf8的char8_t类型

2.char8_t具有和unsigned char相同的符号属性、存储大小、对齐方式以及整数转换等级,但不是unsigned char。3.由于char8_t和unsigned char不是用一种类型,所以其指针间也不同直接赋值。C++23中可以将utf8数据直接保存在char8_t变量中。1.char8_t的字面量类型通过u8定义。

2024-07-28 16:09:29 94

原创 NodeJS:npm的使用

通过该方法将在当前目录下创建文件夹node_modules,并将模块安装到node_modules中。可以通过-g参数指定模块为全局安装,那么模块将安装到/usr/lib/node_modulesl下。npm时nodejs的包安装工具。9.删除当前镜像源,使用默认源。3.安装nodejs模块。查看所有全局模块的信息。查看指定全局模块的信息。10.设置淘宝新镜像源。

2024-07-28 15:41:04 152

原创 Rust:cargo的常用命令

有的时候修改完程序可能需要检查一下程序是否可编译,而不需要真正的编译,以加快检查效率,可以通过。当程序通过了各种测试后,可以通过下面的命令编译经过优化后运行的更快的发布版。编译后的可执行文件位于:hello/target/debug/hello。即可完成编译及运行项目。

2024-07-27 14:04:15 349

原创 Rust:在Ubuntu22.04上安装

尝试后由于网络原因,无法顺利安装。然后编辑rust.sh文件。设置rust.sh为可执行。2.使用国内源进行安装。直接回车选择默认即可。

2024-07-27 12:04:02 826

原创 Ubuntu22.04:使用root用户

Ubuntu默认是不能使用root用户的,需要使用root权限时,可以通过sudo或sudo su。好处是只需输入当前用户的密码就可以。设置root的用户密码。

2024-07-21 21:52:33 402

原创 C++:CLI11命令行分析工具

1.创建目录/usr/include/CLI,然后将release中的CLI11.hpp拷贝到/usr/include/CLI中。CLI11使用起来比较简单,源码下的example目录下有很多例子可以参考。2.将源码中的CLI目录拷贝到/usr/include/目录中。CLI11是一个比较方便的命令行分析工具。使用时直接引入头文件即可,不需要库文件。可以对输入的值进行检查。

2024-07-21 20:56:36 137

原创 Ubuntu22.04:安装Samba

mount时-o参数是可以分开提供的。设置用户xxx访问Samba的密码。3.将用户加入到Samba服务中。1.安装Samba服务。4.配置Samba服务。

2024-07-18 10:12:51 219

原创 Ubuntu22.04:安装并配置nfs

no_root_squash:root用户具有对根目录的完全管理访问权限。/nfsroot:指定/nfsroot为nfs服务器的共享目录。no_subtree_check:不检查父目录的权限。rw:挂接此目录的客户端对该共享目录具有读写权限。*:允许所有的网段访问,也可以使用具体的IP。mount完成后在/nfsroot下创建文件。可以看到test文件,说明mount成功了。如果需要指定nfs的版本可以通过。也可以通过mount命令进行查看。表示支持nfs3及nfs4。然后在nfs目录下查看。

2024-07-18 09:16:20 1660

原创 Linux开发:Ubuntu22.04安装libcurl4

libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证等,使用libcurl可以很方便的完成高层网络协议编程。

2024-07-14 18:40:43 345

原创 Linux开发:Fuse介绍

3.fuse daemon通过读取/dev/fuse将request从内核队列中取出,根据操作调用步骤1中注册的相应回调,也就是回调会具体处理对fuse文件系统的操作请求,当处理完请求后,fuse daemon会将reply通过/dev/fuse传递给fuse driver,此后fuse daemon把requset标记为completed,最终唤醒用户进程。通过fuse内核模块的支持,开发者只需要根据fuse提供的接口实现具体的文件操作时所对应的回调函数,就可以实现一个文件系统。

2024-07-13 16:42:07 154

原创 Linux开发:Ubuntu22.04安装Fuse3

解压缩fuse代码,将解压后的目录挪到/home目录(否则后面的测试无法通过)2.通过pip3安装pytest和looseversion。1.首先需要通过apt安装meson和ninja。

2024-07-13 00:36:59 421

原创 Linux开发:进程件通过UDS传递内存文件句柄

通过UDS传递文件描述符,实际上是共享了同一个内核打开文件表项,所以也是共享文件的偏移量,所以上例中需要通过lseek重新设置偏移量,以便于服务器端读取数据。将两者相结合,就可以通过UDS传递一块内存文件句柄也就是内存数据。可以看到成功的传递了内存文件的内容。介绍了通过UDS传递文件描述符。介绍了如果创建一个内存文件。

2024-07-10 22:10:27 86

原创 Linux开发:通过memfd_create创建一个内存文件

lrwx------ 1 xxx xxx 64 7月 9 21:57 3 -> '/memfd:mem_file (deleted)'memfd_create提供了一个方法,可以在内存中创建一个匿名文件,但是这个文件在真实的文件系统中却不存在。3.文件的初始大小为0,但是可以通过write向文件中写入数据,或通过ftruncate设置文件的大小。4.函数返回的文件描述符与open返回的并无差异,因此可以通过mmap进行文件内存映射。2.函数返回的文件描述符默认已经设置了读写权限。name:文件的名字。

2024-07-10 21:55:27 260

原创 sdbusplus:将文件描述符作为method的返回值

1.服务器端如果没有close文件描述符,那么服务器端的打开文件描述符将不断的增加。2.客户端每次完成dbus调用后打开的文件符都会自动的释放掉,不需要手动的释放。文件描述符也可以作为method的返回值,然后用来传递数据。在客户端运行期间检查客户端打开的文件描述符。介绍了使用文件描述符作为参数的方式。分别运行服务器端和客户端。

2024-07-08 22:41:49 107

原创 Linux开发:进程间通过Unix Domain Socket传递文件描述符

msg_iov和msg_iovlen,指向一个struct iovec类型的数组,用于要保存要传递的数据,由于没有实际的数据要传递,所以sendFd让其指向了一个空的struct iovec e = {NULL, 0};实际上当需要传递大量的数据时,可以通过UDS直接传递文件描述符,这样接收文件描述符的一方,可以直接从传递过来的文件描述符读取数据。这个宏可以传入要发送的控制信息的长度,获取包含控制信息头的完整长度,但不包含padding的长度。设置了msghdr的控制信息指向的地址,以及控制信息的长度。

2024-07-08 22:41:01 1257

原创 Linux开发:进程间通过Unix Domain Socket传递数据

2.客户端可以不bind,bind的目的是给客户端一个明确的UDS文件,这样服务器端可以接收到数据后,向客户端发送响应数据,如果不需要发送响应数据,那么客户端可以不bind,这中情况下服务器端接收到的数据源会是无效的,因为没有客户端sock文件。1.本例是通过类似UDP的 SOCK_DGRAM,也可以通过使用类似TCP的SOCK_STREAM,这种情况下与TCP通信是一样的,服务器端需要listen及accept,客户端需要connect。这两个sock文件是调用bind时创建的。

2024-07-06 21:24:50 411

原创 Linux开发:命名管道

Linux同时支持命名管道,与匿名管道的最大差别在于,匿名管道只能在父子进程间传递数据,命名管道则是通过一个FIFO文件可以在所有进程间进行数据传递。若文件当前没有被以写的方式打开,则以O_RDONLY打开时会阻塞;若文件当前没有被以读的方式打开,则以O_RWONLY打开时会阻塞;可以通过O_NONBLOCK指明为非阻塞打开。mode:管道文件的创建权限;程序不能以读写方法打开FIFO文件。可以看到通过命名管道,程序可以直接传递数据。参数:pathname:管道文件名称;2.打开FIFO文件。

2024-07-06 14:25:15 65

原创 Linux开发:fork进程时避免产生僵尸进程

由于wait/waitpid是阻塞函数,父进程不一定能找到合适的时机调用,这时可以采用两次fork的方式,这样子进程再fork出一个孙子进程,然后子进程立刻退出,这时孙子进程的父进程是子进程,而子进程已经退出了,所以孙子进程就会被标记为init进程的子进程,init进程会定时的回收子进程,因此就不会存在僵尸进程。可以看到进程5538的状态为Z+,这就代表进程为僵尸进程。1.通过wait/waitpid回收子进程。2.通过两次fork的方式。可以看到这种情况没有僵尸进程。可以看到已经没有僵尸进程了。

2024-07-02 21:43:01 179

原创 C++(23):多维数组下标

可以看到C++23中的operator[]可以支持多个参数表示的多个维度了。

2024-07-02 21:42:32 89

原创 Linux编程:通过flock实现文件锁

这是因为通过flock加锁是加在了内核的打开文件表项上,所以通过fork或dup会让多个打开文件描述符指向了同一个文件表项,所以进程会继承锁。可以看到子进程是在1719759853退出的,而孙子进程是在1719759882解锁的。可以看到子进程于1719843246 释放锁后,m1即可获得锁,不需要父进程也释放锁。可以看到m1运行后一直等到1719759882,也就是孙子进程释放锁后,才获得了锁。可以说明孙子进程是继承了爷爷以及父进程的锁的。m1还是使用上例的代码,运行输出。先运行mian再运行m1。

2024-06-30 23:13:33 167

原创 C++:查找两个目录中文件的不同文件

可以看到准确的找出了两个目录中文件的不同。

2024-06-30 14:39:47 126

原创 C++:查找重复文件

【代码】C++:查找重复文件。

2024-06-11 22:30:16 116

原创 Linux开发:多进程通过shm_open/mmap共享内存

用于在tmpfs挂载的/dev/shm目录下打开共享内存文件,由于默认的目录已经为/dev/shm,所以。:打开的文件操作属性:O_CREAT、O_RDWR、O_EXCL的按位或运算组合。介绍了通过SYS V的方式进行多进程间共享内存,这种方式属于比较久远的方式。可以看到w写入的数据被r读取到了,从而完成了多进程间的共享内存。POSIX也提供了共享内存的方法,使用起来要更容易些式。其原理是利用Linux的tmpfs(删除通过shm_open创建的文件。:文件共享模式,例如 0777。

2024-06-06 22:53:56 277

原创 Linux开发:mmap内存映射文件

有些系统不支持匿名内存映射,则可以使用fopen打开/dev/zero文件,然后对该文件进行映射,可以同样达到匿名内存映射的效果。MAP_PRIVATE 对映射区域的写入操作会产生一个映射文件的复制,即私人的“写入时复制”(copy on write)对此区域作的任何修改都不会写回原来的文件内容。通常不鼓励用此旗标。MAP_SHARED对映射区域的写入数据会复制回文件内,而且允许其他映射该文件的进程共享。start:映射区的开始地址,通常设为 NULL,代表让系统自动选定地址,映射成功后返回该地址。

2024-06-06 22:23:04 55

原创 Linux开发:tmpfs文件系统

tmpfs的一大好处就是快,因为它是基于内存,所以读写的速度要比普通的磁盘快的多;简单的说,可以认为是从内存(包括虚拟内存)中取出一定的区域,然后将其虚拟为文件系统挂载在OS上。有时需要每次OS启动后,都要使用tmpfs,这时可通过编辑文件/etc/fstab文件,加入一行。可以看到当前挂载的文件系统中有几个是tmpfs,那么什么是tmpfs呢?这样每次OS启动后都会在/mnt/tmp下挂载一个50MB的tmpfs。通过以下方式可以挂载一个2MB空间的tmpfs。2.修改tmpfs的大小。

2024-06-04 21:14:18 127

原创 sdbusplus:通过文件描述符作为参数调用method

然后当method调用完成后,client关闭了文件描述符4,同时service也可以看到其打开的文件描述符7也关闭了。有的时候需要传递大量的数据,如果将数据通过dbus传递,会消耗大量的带宽。在service端sleep(特意sleep为了观测打开文件描述符)时查看service打开的文件描述符。可以看到client打开了文件描述符4,然后将其作为参数调用service的method。service接收到了该文件描述符7,并可以通过其读取到文件内容hello。以下的client通过文件描述符发送数据。

2024-05-29 22:42:30 602

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除