- 博客(41)
- 收藏
- 关注
原创 GDB符号表概念及Linux获取符号表的方式
需要注意的是,GDB符号表并不是在所有情况下都能够完全准确地反映程序的实际情况。因此,在调试过程中,如果发现GDB符号表不准确或不完整,需要检查编译器选项和程序以来关系,以确保调试的准确性。GDB符号表是在编译时生成的,通常由编译器在生成目标文件时自动生成。在调试过程中,GDB会读取符号表,将程序中的地址解析为符号名称,以便在调试过程中进行源代码定位和变量查看。GDB符号表是GDB调试器在调试过程中使用的一种数据结构,它包含了程序中函数、变量、类型等信息,方便在GDB在调试过程中进行符号解析和地址定位。
2023-11-15 16:16:05
1357
原创 【MQTT】mosquitto库中SSL/TLS相关API接口
Mosquitto 是一个流行的 MQTT 消息代理(broker),它支持使用 SSL/TLS 来保障通信的安全性。
2023-10-01 23:09:04
2057
转载 10种TLS Handshake 协议报文格式
参考文档:https://megamorf.gitlab.io/2020/03/03/traffic-analysis-of-a-tls-session/
2023-10-01 00:49:46
783
原创 SSL/TLS介绍以及wireshark抓包TLS Handshake报文
SSL/TLS是在应用层和传输层之间的一个安全协议,通信的双方在进行通信前需要握手,通过在通信的两端建立一个安全的通道,保护数据在传输过程中的安全性。Session Identifier 的优点是它很简单,但它的缺点是,如果服务器重新启动或者会话超时,之前的Session Identifier就会失效,需要重新建立会话。Session Ticket 的优点是它可以在服务器重启后仍然保持会话的有效性,但需要确保会话票据的安全性,以防止被恶意利用。因为这是一次单向认证的Handshake过程,故比较简单。
2023-10-01 00:25:22
6072
原创 【计算机组成】闪存Flash寿命问题以及如何解决Flash寿命问题
回答这个问题的时候,我们不仅回答如上的如何提高闪存寿命中的要点,同时也可以回答将数据写入硬盘、磁带等磁性存储介质中(注意:不能写入内存中,内存属于易失真的存储介质,断电后数据消失)。如果还有其他的要点,欢迎各位朋友评论区交流。分享一个前几天面试,面试官问的问题:数据向Flash写,数据一多,写入FLASH次数过多,坏掉了怎么办?
2023-09-24 02:10:22
1809
原创 【计算机组成】计算机系统的存储介质
利用局部性原理,可以把程序近期可能用到的数据存放在靠上的层次,把近期内不会用到的数据存放在靠下的层次。提高恰当地控制数据在层次间的移动,使处理器需要访问的数据尽可能地出现在靠近处理器的存储层次,可以大大提高处理器获得数据的速度,,从而近似达到用最快的存储器构建一个容量很大的单机存储的效果。现代计算机中把上述不同的存储介质组成存储层次,以在成本合适的情况下降低存储访问延迟,如图所示,越往上的层级,速度越快,但成本越高,容量越小;越往下的层级,速度越慢,但成本越低,容量越大。
2023-09-23 01:42:50
425
原创 【Linux】Linux线程编程
C/C++程序中,主线程就是通过main函数进入的进程,由主线程调用pthread_create()创建的线程为子线程,子线程也可以有自己的入口函数,该函数有用户创建的时候指定。: 当子线程的属性被设置为"detached"时,主线程与子线程之间的关系被解除,它们相互独立地运行,互不影响。例如,主线程创建多个分离的子线程来处理一些独立的任务,主线程可以继续执行其他操作,而不需要等待子线程的完成。使用可连接的子线程关系可以实现对子线程的控制,例如等待子线程的计算结果、资源释放等。arg:线程执行函数的参数。
2023-09-08 12:14:35
254
原创 【C语言】内存泄漏与内存溢出
当我们申请内存时,需要使用malloc或new等函数来动态分配内存空间,当不需要这些内存时,需要使用free或delete等函数来释放内存空间。因此,在编写程序时,需要注意合理地分配内存,并及时释放不再使用的内存,以避免内存泄漏和内存溢出的问题。同时,可以使用内存管理工具来检测和修复这些问题,例如使用静态分析工具和内存分析工具来检查内存泄漏和内存溢出的情况。然后,我们再次分配新的内存给ptr,导致原来分配的内存丢失,无法再释放。在上述代码中,我们尝试分配一个超过系统可用堆空间的内存,这将导致堆溢出。
2023-09-05 15:47:58
1164
原创 点分IP地址到32位整数之间的转换
例如输入字符串“10.10.10.1",输出168430081。非法ip地址比如“1234.1.test”返回 0。
2023-09-04 14:33:24
1411
原创 什么是内存对齐?为什么要内存对齐
元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每个元素放置到内存中时,它都会认为内存是按照自己的大小(通常它为4或8)来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始,这就是所谓的内存对齐。
2023-08-30 21:35:38
1448
原创 【Linux】进程与线程的区别
进程之间是独立的,拥有独立的地址空间,因此进程之间的并发性相对较低,需要通过进程间通信(IPC)来实现数据共享。而线程共享同一进程的资源,可以直接访问同一进程的全局变量,因此线程之间的并发性较高,数据共享和通信相对容易。而线程是进程内的执行单位,共享同一进程的资源,包括地址空间、文件描述符、堆栈等,线程之间的切换开销相对较小。而线程共享同一进程的资源,一个线程的错误可能会影响整个进程的稳定性,甚至导致崩溃。而线程共享同一进程的资源,一个线程的错误可能导致整个进程的崩溃。
2023-08-30 00:14:54
461
原创 死锁的定义及解决方式
在Linux操作系统中,死锁(Deadlock)是指两个或多个进程(或线程)互相持有对方所需的资源,在无法继续执行下去的情况下产生的一种僵局。这种情况发生时,进程将无法进行下去,无法释放资源,也无法获取需要的资源,从而导致系统无法继续运行。
2023-08-29 18:42:05
502
原创 【Linux】掌握进程优先级:了解Linux中的nice值及其设置方法
Linux操作系统中,每个进程都与一个与之相关的优先级值,被称为”nice“值。nice值用于表示进程对系统资源的需求程度,决定了进程在CPU调度时的优先级。nice值是一个整数,取值范围从-20 ~ +19。较小的nice值表示进程对CPU资源的需求更高,因此具有更高的优先级。而较大的nice值表示进程对CPU资源的需求较低,因此具有较低的优先级。
2023-08-28 19:57:42
2851
原创 计算机网络IP地址分类
ip(Internet Protocol)互联网协议。网络层是整个互联网的核心,网络层向上只提供简单灵活的、无连接的、尽最大努力交互的数据报服务。
2023-08-28 00:46:28
185
原创 git托管代码的过程中,代码冲突解决
3.提交解决冲突后的代码:在你解决冲突并保存文件后,使用 git add 命令将解决冲突的文件添加到暂存区。在提交时,你可以提供一个有意义的提交消息,描述你解决冲突的方式。如果其他人在你操作期间也有新的推送,可能需要先执行 git pull 来获取最新变更,然后再次解决冲突并提交变更。2.解决冲突:当你执行 git pull 后,如果发现有冲突,Git会告诉你哪些文件有冲突,并在文件中显示冲突的部分。你需要手动编辑这些文件,解决冲突。你需要根据你的需求,选择保留你的代码、保留前面人的代码,或者合并两者。
2023-08-28 00:16:34
81
原创 wireshark抓包及TCP协议三路握手与四次挥手的学习
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
2023-08-18 18:40:32
405
原创 【Linux】ubuntu系统开机自动启动dhclient服务
第一个ExecStart命令用于启动ens33网卡,第二个ExecStart命令用于启动dhclient服务。1.打开终端,并切换到root用户或使用sudo命令以管理员权限运行以下命令。在Linux系统中,可以使用systemd来实现开机自动开启网卡并启动dhclient服务。最近发现虚拟机关机再开机重新启动时,dhclient服务需要每次重新开启,非常麻烦,所以设置自动开启的方式,便利远程登录。systemctl enable命令将服务添加到开机启动项,systemctl start命令将启动服务。
2023-08-16 23:57:43
6291
5
原创 MQTT的高度可靠性详解
这意味着在连接中断或重新连接之后,客户端可以恢复之前的会话状态,包括已订阅的主题和发布的消息。它支持消息的确认和重传,保持会话和持久订阅,以及自动重连,以确保消息的完整性和可靠传递。3.持久订阅:MQTT协议支持持久订阅机制,允许订阅者在断开连接和重新连接之后仍然接收到之前订阅的消息。1.QoS级别:MQTT协议定义了三种不同的服务质量(Quality of Service,QoS)级别:QoS 0、QoS 1和QoS 2。消息发布者将消息发送给代理,并等待代理的确认和订阅者的确认。
2023-08-16 16:47:22
1196
原创 计算机网络体系结构
五层体系的协议结构是综合了OSI和TCP/IP优点的一种协议,包括应用层、传输层、网络层、数据链路层和物理层。4.数据链路层:网络层针对的还是主机之间的数据传输服务,而主机之间可以有很多链路,链路层协议就是为了同一链路的主机提供数据传输服务。该层提供了数据交换的定界和同步功能,包括了建立检查点和恢复方案的方法。在最简单的情况下,传输层收取到报文并附上附加信息,该首部将被接收端的传输层使用。6.数据链路层(链路层):数据链路层将网络层交下来的IP数据报组装成帧,在两个相邻节点间的链路上传送帧。
2023-08-14 20:13:46
163
原创 MQTT QoS服务质量等级
MQTT是一种轻量级的消息传输协议,它提供了三种QoS(Quality of Service,服务质量)级别,以确保消息的可靠传输。:最多一次传输。:至少一次传输。:仅一次传输。对于较为重要的MQTT消息,我们通常选用QoS为1或2的服务质量。
2023-08-14 18:09:25
1406
原创 MQTT遗嘱机制
(3)遗嘱QoS:对于遗嘱消息来说,同样可以使用服务质量来控制遗嘱消息的传递和接收。也可以设置为0、1、2。:客户端还可以设置遗嘱标志(Will Flag)来启用遗嘱机制,并设置保留标志(Retain Flag)来指示是否在代理上保留遗嘱消息。(2)遗嘱消息:遗嘱消息定义了遗嘱消息内容。:一旦MQTT代理检测到连接断开,它会根据客户端设置的遗嘱消息内容,将遗嘱消息发送到订阅了相应主题的其他客户端。MQTT遗嘱机制是一种在客户端异常断开连接时发送遗嘱消息的机制,用于通知其他订阅者有关客户端失去连接的消息。
2023-08-14 17:03:43
1166
原创 MQTT心跳机制
在CONNECT消息中,客户端可以设置心跳间隔(Keep Alive interval),即客户端向代理发送心跳消息的时间间隔。如果客户端无法发送心跳消息或代理无法响应心跳消息,则可以根据需要采取响应的处理措施,例如重新连接或关闭连接。此时,客户端必须重新连接到MQTT处理。心跳机制的目的是确保MQTT客户端和MQTT代理(即MQTT服务器)之间的连接保持活动状态,以及检测和处理连接断开的情况。:当MQTT代理检测与客户端的连接断开时,会发送DISCONNECT消息给客户端,以通知其连接断开的情况。
2023-08-14 16:12:38
4307
原创 【Linux】Linux进程间通信——管道通信
进程间通信(IPC,Inter-Process Communication)是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间里处理许多用户的要求。因为即使只有一个用户发出要求,也可能导致一个操作系统中多个进程的运行,进程间必须相互通话。IPC接口就提供了这种可能性。
2023-08-10 15:59:19
211
1
原创 I2C总线通信协议
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线(和)即可在连接于总线上的器件之间传送信息。使用两个微控制器的 I2C 总线配置举例:I2C总线是一种主从结构(Master/Slave)总线,I2C总线上每一个设备都可以作为主设备或从设备,但一个总线上一般只有一个主设备,可以带多个从设备。其中主设备用来产生允许传输的时钟信号,并初始化总线的数据传输,所以主设备通常是CPU;而从设备只能被动响应主设备发起的通信请求,所以各种I2C接口芯片将作为从设备使用。
2023-08-06 16:04:26
1258
原创 linux命令行、程序配置修改串口波特率
stty -a -F /dev/tty0 (tty0是串口名称)stty参数说明-a, --all-g, --save–help–version。
2023-08-05 22:42:37
4151
1
原创 串口通信简述以及RS232、RS485接口标准
串口通信是指将数据按规定时序一个比特位接一个比特位地按序传输。串行通信使用较少通信线路就可以完成信息交换,特别适合计算机与计算机、计算机与外设之间的远距离通信。串口通信需要的线路成本低且较干扰能力强,是嵌入式系统中常用的通信方式。串行通信根据数据的传输方向可分为单工通信、半双工通信和双工通信。①单工通信:发送端和接收端是固定的,数据信号仅从发送端传送到接收端,数据流是单向的②半双工通信:数据可以在两个方向上传送,通信双方既能接收数据也能发送数据,但是发送数据和接收数据不能同时进行。
2023-08-05 15:21:13
3417
1
原创 基于cJSON库学习解析JSON数据格式
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成,它是JavaScript编程语言的一个子集,但采用完全独立于语言的文本格式,C、Python、C++、Java、PHP、Go等编程语言都支持 JSON。
2023-07-31 23:38:53
379
1
原创 iniparser库函数详解
iniparser是针对INI文件的解析器。ini文件则是一些系统或者软件的配置文件。iniparser库的API可以对ini文件(配置文件)进行解析、设置、删除等操作。
2023-07-14 12:19:30
634
1
原创 MQTT简述
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。DUP:发布消息的副本。用来在保证消息的可靠传输,如果设置为1,则在下面的变长中增加MessageId,并且需要回复确认,以保证消息传输完成,但不能用于检测消息重复发送。这就是为什么在介绍里说它非常适合"在物联网领域,传感器与服务器的通信,信息的收集",要知道嵌入式设备的运算能力和带宽都相对薄弱,使用这种协议来传递消息再适合不过了。
2023-07-10 08:06:31
403
1
原创 C语言结构体(Struct)详解
定义结构体、声明结构体变量、访问结构体成员、初始化结构体变量、结构体作为函数参数和返回值、结构体嵌套、结构体指针
2023-07-01 00:19:45
782
原创 C程序编译过程及常见选项
预处理是读取C源程序,对其中的伪指令(以#开头的指令,也就是宏)和特殊符号进行“替换”处理 ,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。使用PC编译器gcc就会生成x86的汇编,而使用ARM的编译器则生成ARM的汇编文件,同一份C代码不作任何修改,使用不同的编译器编译就生成在不同机器上运行的程序,这就是C程序的可移植性。在这个阶段,编译器将预处理后的源代码(通常是C、C++、Objective-C等高级语言)编译成汇编代码(通常是特定CPU架构的汇编指令)。
2023-06-14 16:52:22
570
原创 C程序内存布局
我们知道,早期的计算机系统都是冯·诺依曼体系结构,它是一种将指令和数据合并在一起存储的系统结构。这样CPU在执行程序的时候,将会从指令寄存器(IR,Instruct Register)中取指令并译码执行,而从数据寄存器(DR,Data Register)中取所要操作的数据。因此,对于系统而言就需要区分程序中哪些部分是指令,哪些部分又是数据。
2023-06-12 02:02:17
131
原创 printf()、sprintf()、snprintf()函数用法详解,以及三者区别
C语言中,print()函数是做常用的输出函数之一,用于将一定格式的数据以指定顺序和格式输出到标准输出设备(一般是显示器或控制台)。同时,还有两个类似的函数sprintf()和snprintf()。下面对这三个函数做一下详解,并说明区别。
2023-06-07 21:46:59
2837
1
原创 SQLite API函数
总之,SQLite 是一种轻量级的数据库引擎,并提供了丰富的 API 函数用于与其交互,用户可以通过这些函数实现 SQL 语句的执行、错误信息的获取,查询结果的处理等操作。SQLite 是一种嵌入式 SQL 数据库引擎,其库文件大小小、速度快,常被用于轻量级的数据库应用开发,也广泛支持不同的编程语言,如 C、C++、Python 等。sqlite3_open()函数用于打开一个SQLite数据库,返回一个sqlite3的指针,用于后续操作数据库。3.获取执行错误信息。
2023-06-07 21:18:50
756
1
原创 setitimer函数介绍
setitimer()是C语言中一个系统调用函数,用于设置定时器timer()。which:用于指定定时器类型,可以是ITIMER_REAL(实时定时器)或ITIMER_VIRTUAL(虚拟计时器);虚拟计时器在普通进程(normal process)中使用,其精度比实时计时器低,但可以支持秒级和毫秒级的定时器。it_interval:指定定时器重复间隔时间,如果值为0,代表定时器不重复,仅在第一次超时后触发一次信号;new_value:参数是一个指向itimerval结构的指针,用于设置新的定时器值;
2023-06-07 20:24:52
2558
1
原创 POSIX
POSIX:可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX )
2023-06-07 08:00:00
230
1
原创 __USE_XOPEN2K宏定义
__USE_XOPEN2K是一个宏定义,用于启用一组支持 X/Open Portability Guide Issue 4(XPG4)的特性,这些特性包括很多常用的标准 POSIX 函数,比如strptime()、gettimeofday()、timer_create()等。
2023-06-06 21:31:05
781
原创 signal()函数
函数指针的返回类型为void,参数为int类型。也就是说,当信号被捕捉时,该函数会被调用,并传入信号编号作为参数。signal()函数是一个用于信号处理的POSIX标准C函数,原型定义在头文件中,用于。当程序接收到SIGINT信号(比如用户按下 Ctrl-C)时,第二个参数是一个函数指针,指向一个函数,这个函数在信号被捕捉时调用。第一个参数是一个整数,用于指定信号编号;在这个例子中,我们注册了一个名为。函数会被调用,并输出一条消息。
2023-06-06 20:22:02
1909
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人