- 博客(34)
- 收藏
- 关注
原创 arm交叉编译器在linux和qnx平台的差异---记一次内存溢出导致的qnx崩溃,linux平台不崩溃问题
摘要:本文分析了AArch64架构下进程内存布局特点,重点对比了Linux和QNX平台在栈保护机制上的差异。在Linux ARM交叉编译环境下,默认关闭栈保护(-fno-stack-protector),而QNX平台默认开启-fstack-protector-strong保护。文章详细展示了进程内存空间分布,包括栈区(向低地址增长)、堆区(向高地址增长)、共享库映射区等关键区域,并以具体函数栈帧为例说明变量在栈中的排布情况。特别指出了崩溃点xxxDB_Item_Update函数栈帧中的关键变量布局,为分析栈
2026-04-20 13:54:00
470
原创 sqlite3_prepare_v2 与 sqlite3_exec 在 SQLite 中的核心区别
SQLite中sqlite3_prepare_v2和sqlite3_exec的核心区别在于性能和安全性。sqlite3_prepare_v2通过预编译SQL语句实现高效复用,在批量操作中比sqlite3_exec快50倍以上(1000万条数据仅需92秒)。安全性方面,sqlite3_prepare_v2支持参数化绑定,能有效防止SQL注入,而sqlite3_exec存在字符串拼接风险。建议高频操作和涉及用户输入时使用sqlite3_prepare_v2,简单DDL语句可使用sqlite3_exec。预编译机
2026-04-13 16:05:54
517
原创 Windows与Ubuntu文件共享详细指南
本文详细介绍了Windows与Ubuntu系统间实现文件共享的完整方案。主要内容包括:1)在Ubuntu上安装Samba服务;2)创建挂载点目录;3)设置Windows共享文件夹权限;4)通过CIFS协议挂载Windows共享目录;5)测试双向文件同步功能;6)配置fstab实现开机自动挂载。文章还提供了常见问题的解决方案,如权限设置、网络连接和挂载失败等注意事项。该方案可实现Windows目录与Ubuntu系统的实时双向同步,适合需要在不同操作系统间共享文件的用户。
2026-04-03 16:58:42
497
原创 SOCKET close后引用计数器何时归零?何时发出RST/FIN?
本文分析了close()函数在TCP连接中的行为特点。通过内核源码解析,揭示了close()不会立即释放资源的关键机制:只有当f_count引用计数归零时才会触发真正的资源释放。文章通过图示展示了文件描述符表和内核数据结构的关系,并提供了两种优化关闭连接的方案:1)使用shutdown+close组合配合SO_LINGER选项;2)使用SO_REUSEADDR选项。实际测试表明,仅调用close()可能不会立即终止连接,需要确保所有引用都被清除才会发送FIN/RST包。本文为开发者正确处理TCP连接关闭提供
2026-03-30 10:45:17
224
原创 tcp传输字节序<->大端序互转
本文提供了跨平台字节序转换的完整实现方案,包含标准整数类型(16/32/64位)和浮点数的转换函数。方案通过条件编译适配不同平台(GCC/Clang/MSVC/macOS/Linux),并提供了内存操作版本。对于Linux平台特别列出了原生转换函数的快速参考表,包括htobe16/be16toh等函数。所有实现都考虑了大小端检测和对称转换特性,确保数据在网络传输中的正确解析。
2026-01-13 11:06:22
208
原创 c++序列容器、关联容器、非序列关联容器简单介绍
C++标准库容器分类与使用指南 摘要: C++标准库容器分为序列容器、关联容器和无序关联容器三大类。序列容器包括array、vector、deque、list和forward_list,支持线性存储;关联容器如set、map等使用红黑树实现有序存储;无序关联容器如unordered_set等基于哈希表实现快速查找。文章详细介绍了各类容器的特性、使用场景和性能特点,如vector适合尾部操作,list适合任意位置插入,set适合有序存储等,并提供了代码示例。最后给出容器选择建议:需考虑元素顺序、操作位置、访问
2025-09-26 13:44:40
984
原创 DLADDR 动态绑定 多日志系统
是 Linux 系统中用于动态链接器诊断的函数,可以查询某个内存地址所在的共享对象(如可执行文件或。可以实现灵活的模块化运行时管理,尤其适合需要动态识别调用来源的场景(如日志、调试、插件系统)。可以实现运行时动态识别调用者模块(进程或动态库),适用于日志、调试、模块化系统等场景。的性能影响需要结合具体使用场景分析。在高频日志打印场景中,
2025-09-10 15:39:56
1152
原创 fwrite和write函数的数据流,从用户缓冲区到页缓存,再到磁盘文件的完整过程
摘要:fwrite函数通过多级缓冲机制实现高效文件写入,包括用户空间缓冲区、内核页缓存和磁盘存储三个阶段。用户空间缓冲区根据文件类型和模式分为全缓冲、行缓冲和无缓冲三种类型。数据通过write系统调用进入内核页缓存,最终由回写机制写入磁盘。fprintf函数遵循文件流的缓冲模式,默认使用完全缓冲。通过fflush或fsync可控制数据持久化时机,平衡I/O性能与数据一致性。该机制在保证数据可靠性的同时,显著提升了文件操作效率。
2025-07-30 11:06:54
1389
原创 ASan 学习资源与实战指南
Git**:/san Wiki://github/san/wiki/itizer -案例分析溢出栈溢出AF -技巧(化/误内存泄漏 - Val 的性能。交互式:[ASground](fzing-projectutorials.html -修改查看 报告 - 10+内存。🔥 学习网站1. ****:Sanit Cl](httpsang…最的 AS技术 -编译选项类型、内部 - LinuxacOS 多。fnoize-salls \ 禁用调用优化 -g -o```
2025-07-03 17:09:25
813
原创 C++之std::string的resize与reverse
在C++中我们经常用std::string 来保存字符串,其中有两个比较常用但是却平时容易被搞混的两个函数,分别是resize和reserve,模糊意识里,这两个方法都是对std::string的容量或元素进行操作,那么这两个函数到底做了什么呢?先声明string中的两个概念,capaticy(容量)和size(大小)
2023-11-06 17:25:35
2235
原创 网络编程中的SO_REUSEADDR和SO_REUSEPORT参数详解
linux kernel 3.9 引入了最新的SO_REUSEPORT选项,使得多进程或者多线程创建多个绑定同一个ip:port的监听socket,提高服务器的接收链接的并发能力,程序的扩展性更好;此时需要设置SO_REUSEPORT(注意所有进程都要设置才生效)。(3)只有effective-user-id相同的服务器进程才能监听同一ip:port (安全性考虑)(1)避免了应用层多线程或者进程监听同一ip:port的“惊群效应”。
2023-02-22 13:54:25
1283
原创 tcp的粘包拆包及其解决方式
假设客户端向服务端连续发送了两个数据包,用 packet1 和 packet2 来表示,那么服务端收到的数据可以分为三种,现列举如下第一种:服务端正常接收到这两个数据包 package1 和 package2,即没有发生拆包和粘包第二种:接收端只接收到一个包,由于tcp不会出现丢包的现象。所以这一个数据包中包含了发送端发送的两个数据包的信息,这种现象即为粘包。这种情况由于接收端不知道这两个数据包的界限,所以对于接收端来说很难处理。
2023-02-15 14:01:55
385
原创 getopt 和 getopt_long 基本用法【MAN GETOPT_LONG】
【代码】getopt 和 getopt_long 基本用法【MAN GETOPT_LONG】
2022-11-17 16:52:23
352
原创 errno设置后的生存周期小记
errno is thread-local; setting it in one thread does not affect its value in any other thread.(线程安全,不用担心被打断后,errno被其他线程修改)
2022-11-11 15:47:45
351
原创 局部变量作用域
全局变量,在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。用static来声明静态局部变量,局部变量的值在函数结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量保留上次函数调用结束时的值。局部变量是指在函数内部定义的变量 ,作用域为定义局部变量的函数,也就是说他只能在定义他的函数中使用,最值得注意的是。
2022-11-08 13:42:36
366
原创 IP路由原理——技术详解
路由转发数据过程其实很简单,简单的总结就是:路由接收数据包→查看目的地址→与路由表进行匹配找到转发端口→转发到该端口具体路由器工作过程:1)、PC1要给PC2发送数据,因为地址不在同一个网段,PC1会将数据包发送给本网段的网关路由R1的G0/1接口,2)、R1路由器接收到数据包,查看数据包IP头部中目的地址是2.100,再查询自己路由表,发现到达192.168.2.0/24网段需要从G0/0接口出去,于是R1路由器将数据包发送到G0/0接口,并由此接口将数据发出去到达R2路由器。3)、R2路由器收到一个来自
2022-07-10 17:06:48
6101
原创 一文读懂TCP/IP组包发包全过程
应用层:HTTP协议是生成针对目标WEB服务器的HTTP请求报文,该报文就是需要传递的数据HTTP协议使用的是TCP协议,为了方便通信,将HTTP请求报文按序号分为多个报文段(segment),并对每个报文段进行封装。PC1使用本地一个大于1024以上的随机TCP源端口(这里假设是1030)建立到目的服务器TCP80号端口的连接,TCP源端口和目的端口加入到报文段中,学名叫协议数据单元(Protoco............
2022-07-06 15:25:29
3386
原创 top命令详解(转载学习)
本文转载来源:https://www.jianshu.com/p/8a6754f919c5 感谢作者@道无虚1、top命令简介top命令是动态查看进程变化,监控linux的系统状况;它是常用的性能分析工具,能够实时显示系统资源各个进程占用状况,类是windows的任务管理器。1.1 语法[root@localhost ~]# top -h procps-ng version 3.3.10Usage: top -hv | -bcHiOSs -d secs -n max -u|U user -
2022-04-15 11:04:32
3241
转载 [译] Linux 异步 I/O 框架 io_uring:基本原理、程序示例与性能压测(2020)
本文参考:https://arthurchiao.art/blog/intro-to-io-uring-zh/ ,复制在此只为学习时方便,以防原文丢失!译者序本文组合翻译了以下两篇文章的干货部分,作为 io_uring 相关的入门参考:How io_uring and eBPF Will Revolutionize Programming in Linux, ScyllaDB, 2020An Introduction to the io_uring Asynchronous I/O Framewor
2022-04-06 13:48:34
1009
转载 memmove/memcpy/memmcpy的区别和示例
**memcpy和memmove()**都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:void *memcpy(void *dst, const void *src, size_t count);void *memmove(void *dst, const void *src, size_t count);他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。第一种情况
2022-03-31 10:35:57
466
转载 linux下网络程序遭遇SIGPIPE的解决(转)
问题描述:我的一个服务器程序, 在Windows下运行正常.但当在Linux(centos 6.3)下,进行对端未开启的异常测试时,出现莫名退出 . 最后跟踪到是write调用导致退出. 用gdb执行程序, 退出时提示"Broken pipe".问题分析:对一个对端已经关闭的socket调用两次write, 第二次将会生成SIGPIPE信号, 该信号默认结束进程.具体的分析可以结合TCP的”四次握手”关闭. TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对
2022-03-30 14:54:03
1200
转载 c++11多线程之 std::future std::promise std::packet_task std::async 简述及基本使用
先说明一点:std::asyanc是std::future的高级封装, 一般我们不会直接使用std::futrue,而是使用对std::future的高级封装std::async。 下面分别说一下。一、std::async基本用法std::future可以从异步任务中获取结果,一般与std::async配合使用,std::async用于创建异步任务,实际上就是创建一个线程执行相应任务。std::async就是异步编程的高级封装,封装了std::future的操作,基本上可以代替std::thread
2021-11-11 19:09:14
645
原创 vscode自定义编译器
项目需要使用交叉编译器高版本,手动增加交叉编译器10.2确定cmake-tools-kits.json位置locate cmake-tools-kits.json编辑配置文件vi /home/coco/.local/share/CMakeTools/cmake-tools-kits.json增加新的编译器路径[{“name”: “GCC 10.2 aarch64-linux-gnu”,“compilers”: {“C”: “/home/coco/cross_com
2021-11-04 10:43:16
1939
原创 Sqlite3插入速度比较(sqlite3_exec/sqlite3_prepare)
最近做到的项目涉及一个大数据量缓存重传,其中要用到的sqlite技术,把自己的学习心得整理了一下。SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite数据库由于其简单、灵活、轻量、开源,已经被越来越多的被应用到中小型应用中。因此在许多软件中例如(QQ,微信)
2021-10-20 15:29:12
4356
1
原创 TcpServer之select/poll/epoll优缺点及服务端示例代码
一、selectselect函数原理select系统调用是用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这⾥里等待,直到被监视的文件句柄有一个或多个发⽣生了状态改变。关于文件句柄,其实就是⼀一个整数,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构的表示就是stdin、stdout、stderr。1.我们通常需要额外定义一个数组来保存需要监视的文件描述符,并将其他没有保存描述符的位置初始化为一个特定值,
2021-09-09 19:50:19
1486
原创 CMakeLists.txt简单使用之实战
CMakeLists.txt编写简述以下为必须选项:CMAKE_MINIMUM_REQUIRED (VERSION 3.5)set(TARGET_NAME HelloWorld)1. include pathINCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/inc)#PROJECT_SOURCE_DIR 最顶层cmakelist位置2. source code pathAUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/sr
2021-09-08 20:39:57
952
转载 TCP Status
网上很多大佬整理TCP三次握手、四次挥手,看到过很多人写,但其实从运维角度来说,我们分析 TCP 链接状态的时候,首先是用netstat或ss来查看。之后才会根据 TCP 状态的情况进行抓包分析,进一步确认一些问题,所以我们首先看到的会是 TCP 的状态,那么就需要很清楚的了解 TCP 的11种状态代表着什么。TCP 的11种状态分别对应 TCP 三次握手过程的5种状态和TCP四次挥手断开过程中的6种状态。如上图,就是11种状态,在整个TCP建立连接和断开连接的整个过程。下面用 tcpd
2021-08-26 19:20:26
522
转载 socket通信简述
对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问:1.什么是TCP/IP、UDP?2.Socket在哪里呢?3.Socket是什么呢?4.你会使用它们吗?什么是TCP/IP、UDP?TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,...
2021-08-26 18:44:39
11082
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅