- 博客(342)
- 资源 (14)
- 收藏
- 关注
原创 C++:面试题汇总
本文介绍了C++编程中的一些基础概念和内存管理技术。首先,指针和引用的区别在于指针可以重新赋值并指向不同的对象,而引用是对象的别名且不能改变绑定对象。接着,const关键字用于定义常量,确保变量值不被修改,而static关键字用于控制变量和函数的生命周期和作用域。define用于定义宏,而inline用于内联函数以减少函数调用开销。constexpr用于编译时常量,volatile用于防止编译器优化,extern用于跨文件访问全局变量。std::atomic提供了对基本数据类型的原子操作封装,解决多线程数据
2025-05-22 23:00:00
676
原创 Linux:面试题
本文概述了操作系统中的关键概念和机制。中断和异常分别由外部设备和CPU内部触发,用于处理紧急事件和错误。用户态和核心态区分了进程和操作系统的运行环境。
2025-05-20 22:45:00
1147
原创 C++ :STL
STL(Standard Template Library)是C++标准库的核心,通过泛型编程提供高效的数据结构与算法处理。它包含四大组件:容器、迭代器、算法和函数对象。容器分为序列容器(如vector、list)、关联容器(如set、map)和容器适配器(如stack、queue),用于管理数据集合。迭代器提供访问容器元素的统一接口,支持多种操作方式。算法是独立于容器的通用函数,用于排序、查找、修改等操作。函数对象通过重载()运算符,用于算法的自定义操作。STL的设计使得C++程序员能够高效地处理复杂的数
2025-05-19 21:00:00
863
原创 C++:⾯向对象的三⼤特性
面向对象编程的三大特性包括继承、封装和多态。继承允许子类继承父类的属性和方法,实现代码复用;封装通过访问控制隐藏内部实现细节,仅对外提供必要接口;多态则允许不同类的对象通过相同接口调用,增强代码灵活性。访问修饰符如public、private和protected控制成员的访问权限。多重继承允许一个子类继承多个父类的特性。重载和重写的区别在于作用域和参数列表,重载在同一作用域内,重写则在继承关系中。C++多态通过虚函数和指针/引用实现,虚函数表存储虚函数地址。构造函数和析构函数分别用于对象初始化和资源释放。虚
2025-05-18 23:15:00
712
原创 C++:C++内存管理
C++ 内存管理涉及多个关键概念和区域,包括栈、堆、全局/静态存储区、常量存储区和代码区。栈用于存储局部变量和函数参数,由编译器自动管理;堆用于动态内存分配,需手动管理,容易产生内存泄漏。内存泄漏通常由未正确释放内存或指针丢失引起,可通过智能指针、RAII原则和内存检测工具避免。智能指针(如 std::unique_ptr、std::shared_ptr 和 std::weak_ptr)自动管理对象生命周期,减少手动内存管理的风险。野指针和悬浮指针分别指向无效内存和已销毁对象,可通过初始化指针和使用智能指针
2025-05-17 21:00:00
367
原创 C++:字符串操作函数
本文介绍了C++中常用的字符串处理函数和容器类方法。strcpy()用于复制字符串,strlen()计算字符串长度,strcat()连接字符串,strcmp()比较字符串。这些函数在处理字符串时非常有用,但需注意目标字符串的空间是否足够。此外,std::string类中的length()和size()方法功能相同,均返回字符串的字符个数。容器类如vector中的size()方法用于返回容器中元素的数量。这些函数和方法在字符串处理和容器操作中具有广泛的应用。
2025-05-16 21:15:00
272
原创 C++ 基础知识点
指针和引用是C++中两种重要的概念,指针存储变量的内存地址,可以重新赋值并支持空值,适合动态内存管理;引用是对象的别名,初始化后不能更改,且不能为空,语法更简洁安全,常用于函数参数传递和操作符重载。const关键字用于声明常量,保证变量值不被修改,可修饰变量、函数参数、成员函数等,常用于指针、引用和成员函数的常量声明,提升代码安全性。static关键字用于限制变量或函数的作用域,延长局部变量的生命周期,或声明类成员为静态,使其属于类而非对象,所有对象共享同一个静态成员。
2025-05-15 22:30:00
890
原创 Linux驱动:驱动编译流程了解
本文介绍了在开发板中编译Linux内核镜像(zImage)的步骤,并详细说明了内核源码树的配置和编译过程。首先,通过解压内核源码包并配置编译选项,生成了自定义的内核镜像。编译过程中遇到的错误通过重新执行编译命令得以解决。其次,文章详细讲解了常用的内核模块操作命令,包括lsmod、insmod、modinfo和rmmod,并提供了使用modprobe加载和卸载模块的示例。最后,通过一个简单的内核模块示例代码(module_test.c)和对应的Makefile,展示了如何编译和加载自定义内核模块,并将生成的模
2025-05-12 23:01:14
722
原创 C++ 模板方法模式详解与实例
模板方法模式(Template Method Pattern)属于行为型设计模式,其核心思想是在一个抽象类中定义一个算法的骨架,而将一些步骤延迟到子类中实现。这样可以使得子类在不改变算法结构的情况下,重新定义算法中的某些步骤。它通过继承机制,实现代码复用和行为扩展,减少重复代码,提升程序的可维护性和扩展性。
2025-05-08 20:15:00
1017
原创 STM32:看门狗
窗口看门狗(WWDG)由系统时钟(PCLK1)分频后驱动,其工作依赖于系统时钟的正常运行。它相较于独立看门狗,具有更严格的时间监控机制。窗口看门狗设置了一个时间窗口,喂狗操作必须在这个时间窗口内完成,早于或晚于该窗口都会导致系统复位。这种特性使其能够更精准地监控程序的运行状态,适用于对程序运行时序要求较为严格的场景。
2025-04-27 18:12:30
556
原创 模式设计简介
八大原则贯穿面向对象设计的核心逻辑,最终指向以下目标:解耦:降低模块间依赖,使系统更灵活复用:通过抽象与封装提高代码复用性健壮性:减少修改导致的连锁反应,降低维护成本可扩展性:支持通过新增代码而非修改旧代码扩展功能在实际开发中,需根据场景灵活组合原则,避免过度设计。例如,复杂业务场景可优先使用组合 + 接口隔离,简单场景可通过继承快速实现(但需警惕继承的局限性)。
2025-04-25 22:45:00
981
原创 Linux应用:网络基础
OSI(Open Systems Interconnection)模型即开放式系统互联参考模型,是一个逻辑上的网络通信架构标准。它将网络通信的功能划分为七个层次,从下到上依次为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。每一层都有其特定的功能和职责,层与层之间相互协作,通过接口进行通信。这种分层结构使得网络通信的设计和理解更加模块化,便于故障排查、技术升级以及不同厂商设备之间的互操作性。例如,物理层负责处理物理介质上的信号传输,如电缆、光纤中的电信号或光信号;
2025-04-23 21:21:15
641
原创 windows USB 了解
这些函数通常按以下顺序使用:调用 SetupDiGetClassDevs 函数创建设备信息集。利用 SetupDiEnumDeviceInterfaces 函数枚举设备信息集中的设备接口。针对每个枚举到的设备接口,调用 SetupDiGetInterfaceDeviceDetail 函数获取详细信息。最后调用 SetupDiDestroyDeviceInfoList 函数销毁设备信息集,释放资源。
2025-03-28 22:07:04
646
原创 vs2022+QT6.7.3打包程序流程
5、管理员方式打开x64 Native Tools Command Prompt for VS 2022,进入test目录,执行:windeployqt6.exe XXX.exe。6、修改程序名称:在"项目->属性->配置属性->常规"选项卡下的“目标文件名”选项,和“项目->属性->配置属性->链接器->常规”选项卡下的“输出文件”选项保持一致即可。4、管理员方式打开Qt 6.7.3 (MSVC 2022 64-bit),进入test目录,执行:windeployqt6.exe XXX.exe。
2025-03-28 21:45:00
324
原创 Linux应用:线程进阶
信号量(Semaphore)是一个整型的计数器,用于控制对共享资源的访问。它通过 PV 操作来实现同步,P 操作将信号量的值减 1,如果值小于 0 则线程阻塞;V 操作将信号量的值加 1,如果有线程在等待则唤醒一个等待的线程。sem_t属于信号量类型,sem是所定义的信号量变量。sem_wait(&sem):这是信号量的 P 操作,其作用是将信号量的值减 1。若信号量的值为 0,线程会被阻塞,直至信号量的值大于 0。printf(“线程进入临界区\n”);:输出线程进入临界区的信息。
2025-03-27 23:19:11
960
原创 Linux应用:线程基础
进程:是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基本单位。每个进程都有自己独立的地址空间、内存、数据栈以及其他用于维护进程运行的资源。线程:是进程中的一个执行单元,是程序执行的最小单位。线程共享所属进程的资源,如地址空间、打开的文件等,但有自己独立的栈空间和程序计数器等。
2025-03-27 22:11:41
834
原创 Linux应用:异步IO、存储映射IO、显存的内存映射
全部刷新实现简单,但效率较低;更新刷新能提高效率,但实现复杂度较高,需要额外的处理来检测变化区域。在实际应用中,要根据具体的需求和场景选择合适的刷新方式。
2025-03-24 23:05:51
1847
原创 Linux应用:select、poll
在阻塞 I/O 模型中,当应用程序调用一个 I/O 操作(如读取文件、从网络套接字接收数据等)时,该应用程序会被阻塞,直到 I/O 操作完成。例如,一个进程调用read系统调用从磁盘读取数据,在数据从磁盘传输到内核缓冲区并复制到用户空间之前,进程会一直处于等待状态,无法执行其他任务。这种模型简单直接,但在等待 I/O 完成的期间,进程资源被浪费,无法进行其他有用的工作。。
2025-03-24 22:57:34
801
原创 Linux应用:Linux的信号
捕获信号并自定义处理:进程可以定义一个信号处理函数,当接收到特定信号时,内核会调用该函数,进程在函数中可以执行自定义的操作。首先需要定义信号处理函数,int fd;int* ptr;if (fd!if (ptr!exit(0);return 0;stdio.h:提供标准输入输出库函数,如 printf 用于输出信息。
2025-03-20 23:32:02
1061
原创 Linux应用:进程间通信
SystemV IPC 是 UNIX System V 操作系统中引入的一组进程间通信机制,包括消息队列、共享内存和信号量。这些机制在 Linux 系统中也得到了广泛应用。。
2025-03-20 22:59:47
934
原创 Linux应用:程序运行
kill命令的这种用法是向指定的进程发送特定信号编号的信号。信号在操作系统中是一种软件中断机制,用于通知进程发生了某种特定事件或要求进程执行特定操作。。
2025-03-17 23:13:07
620
原创 Linux应用:进程详解
程守护进程是一种在后台运行且不受终端控制的进程。它具有以下特点:生存期长:从系统启动开始运行,一直持续到系统关闭,期间持续提供特定服务。脱离控制终端:守护进程启动后,与创建它的终端脱离关系,即使终端关闭,它也能继续运行。运行在特定会话和进程组:通常会创建自己独立的会话和进程组,避免受到其他进程的干扰。。
2025-03-16 20:51:49
607
原创 Linux应用:进程的回收
waitpid函数也是用于等待子进程结束的系统调用,它比wait函数更加灵活。waitpid可以指定等待特定 PID 的子进程,也可以设置非阻塞等待模式或者阻塞模式。通过waitpid,父进程可以更精确地控制对子进程的等待和资源回收操作,例如可以在不阻塞父进程的情况下,定期检查子进程是否结束。pid_t pid;int status;// 创建子进程// 处理 fork 失败的情况return 1;// 子进程代码printf("子进程开始执行,PID: %d\n", getpid());
2025-03-14 21:14:30
631
原创 Linux应用:PCB、fork
子进程是由另一个进程(父进程)通过fork或其他类似机制创建的新进程。子进程继承了父进程的许多属性,如用户 ID、组 ID、环境变量、文件描述符等,但它有自己独立的 PID 和内存空间,与父进程并发执行,在一定程度上可以看作是一个独立的程序在运行。
2025-03-13 21:32:55
885
原创 linux应用:进程前章
操作系统加载程序:当用户在命令行输入程序的可执行文件名或者通过图形界面点击应用程序图标时,操作系统的加载器(loader)开始工作。加载器会在磁盘上找到对应的可执行文件,该文件遵循特定的格式,如 ELF(Executable and Linkable Format,用于 Linux 系统)。加载器将可执行文件中的代码和数据加载到内存中,并设置好运行环境,包括初始化栈(stack)等。。
2025-03-12 22:13:42
889
原创 linux应用:随机数、proc
proc是一个虚拟文件系统,它提供了一种内核与用户空间交互的方式,通过文件和目录的形式展示内核对象的信息,包括进程信息、系统状态、硬件设备信息等。它并不占用实际的磁盘空间,而是在内存中动态生成。当访问/proc下的文件时,内核会实时生成相应的信息并返回给用户空间程序。与时间相关的 proc 文件。
2025-03-12 19:52:52
839
原创 Linux应用:时间API
在 Linux 内核中,jiffies 是一个非常重要的全局变量,它记录了系统启动以来产生的时钟中断次数。每发生一次时钟中断,jiffies 的值就会增加 1。时钟中断是由硬件定时器产生的,其频率在系统编译时就已经确定,通过HZ宏来表示,单位是赫兹(Hz)。例如,如果HZ的值为 1000,那就意味着系统每秒会产生 1000 次时钟中断,jiffies 每秒也会增加 1000。jiffies 的类型通常是unsigned long,这使得它能够表示一个非常大的计数值,即使系统运行很长时间也不会溢出。
2025-03-11 20:58:19
1063
原创 linux应用:静态文件、 inode(i 节点)、vnode、流
inode(index node,索引节点)是 Unix/Linux 文件系统中的一种数据结构,用于存储文件的元数据信息,每个文件和目录在文件系统中都有一个对应的 inode。inode 是文件系统管理文件的核心,它记录了文件的各种属性和数据块的存储位置等信息。
2025-03-10 21:12:01
1183
原创 Linux应用:文件属性
umask 是 Linux 系统中用于控制新创建文件和目录默认权限的掩码。它决定了在创建文件或目录时,从默认权限中去除哪些权限位。umask 的值是一个八进制数,与文件和目录的权限位相对应。umask 的工作机制当用户创建一个文件或目录时,系统会先根据默认的权限模式(文件通常是 666,目录通常是 777),然后与 umask 进行按位取反的 “与” 操作,得到最终的实际权限。例如,umask 的值为 022,对于文件来说:默认权限 666(八进制)转换为二进制是 110 110 110。
2025-03-09 21:27:02
965
原创 linux应用:文件描述符、lseek
fcntl函数是一个功能强大的文件控制函数,它可以对已打开的文件描述符进行各种操作,包括复制文件描述符、改变文件状态标志、设置和获取文件的访问控制权限等。fd:需要操作的文件描述符。cmd:指定要执行的操作命令,常见的命令如下:F_DUPFD:复制文件描述符fd,返回一个新的文件描述符,新描述符是当前进程中未使用的最小整数值。与dup函数类似,但fcntl通过F_DUPFD提供了更多控制选项。close(fd);// 现在fd和new_fd都指向同一个文件close(fd);
2025-03-06 22:07:59
1026
原创 QT:TCP示例
定义的区别内存分配首先声明了一个RecvServer类型的指针server。接着使用new操作符在堆(heap)上分配内存来创建一个RecvServer对象,并将对象的地址赋值给server指针。堆内存的分配较为灵活,适用于需要在程序运行期间动态创建和销毁对象,且对象生命周期可能跨越多个函数调用或作用域的场景。例如,在一个需要长期运行的服务器程序中,服务器对象可能需要在整个程序生命周期内持续存在,此时在堆上分配内存更为合适。直接在栈(stack)上创建一个RecvServer对象。
2025-03-05 22:42:19
577
原创 linux应用:errno、perror、open、fopen
errno 是一个全局变量,定义在 头文件中。当系统调用(如 open、read、write 等)或库函数执行失败时,会将一个错误码赋值给 errno。不同的错误码代表不同的错误类型,通过检查 errno 的值,可以判断具体发生了什么错误。代码中使用 open 函数尝试打开一个不存在的文件。由于文件不存在,open 函数会执行失败并返回 -1。当 open 函数返回 -1 时,通过检查 errno 的值来判断具体的错误类型。ENOENT 是一个预定义的错误码,表示文件或目录不存在。
2025-03-04 23:19:26
763
原创 linux应用:文件IO
文件描述符(File Descriptor)是在 Linux 等操作系统中用于标识已打开文件的整数。它是操作系统内核为了管理文件而分配给每个打开文件的一个唯一标识符静态文件是指内容固定不变的文件,在服务器上以固定的格式存储,每次被请求时,服务器直接将其内容发送给客户端,不经过任何动态处理。动态文件是指内容根据不同的条件和请求而动态生成的文件。服务器在接收到客户端请求时,会根据请求的参数、用户的状态、数据库中的数据等因素,通过执行相应的程序或脚本动态生成文件内容,然后发送给客户端。O_RDONLY。
2025-03-03 19:37:41
560
原创 QT:三连问
信号(Signal):是由对象发出的事件通知。当一个对象的状态发生变化或者某个特定事件发生时,它就会发出一个信号。信号是在类中使用 signals 关键字声明的函数,只声明不实现,例如 void signalName();。信号可以携带参数,以便在信号发出时传递相关信息。槽(Slot):是用于接收信号并执行相应操作的函数。槽函数在类中使用 slots 关键字声明,与普通的 C++ 函数类似,但它可以与信号进行连接。当与槽函数连接的信号被发出时,槽函数就会被自动调用。
2025-03-02 18:31:13
816
原创 QT:Echart-折线图
html 文件的基础上实现鼠标移动图表上的点,可以按照以下步骤添加相应的 JavaScript 代码来实现交互功能。主要思路是通过监听鼠标事件(按下、移动、松开),判断鼠标是否在点的范围内,若在则允许拖动点并更新图表数据。使用 Qt Designer 创建一个主窗口,添加一个 QLineEdit 和一个 QWebEngineView。注意HTML文件当中的echarts.min.js文件路径。在 UI 设计中添加一个 QLabel 控件。
2025-03-01 20:01:30
364
原创 QT:QT场景视图
QGraphicsScene:场景类,作为一个容器,用于管理大量的 QGraphicsItem 对象。它不直接显示图形,而是负责存储和组织这些图形项,提供对图形项的添加、删除、查找等操作,同时处理图形项的碰撞检测、鼠标事件等。QGraphicsView:视图类,它是一个可视化的窗口,用于显示 QGraphicsScene 中的内容。可以对视图进行缩放、平移、旋转等操作,还能处理用户的交互事件,如鼠标点击、滚动等。QGraphicsItem:图形项类,是所有图形元素的基类。
2025-02-27 21:56:56
1777
wrieshark.zip
2021-03-12
IAR for 430
2020-10-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人