- 博客(1221)
- 资源 (4)
- 问答 (1)
- 收藏
- 关注
原创 Linux系统软件工程师/嵌入式Linux应用开发工程师 知识体系构建 500篇(持续更新)
今年受疫情影响,企业经营必不可免地受到冲击,企业在选人用人方面比以往都更加谨慎,招聘也更加苛刻。hr都试图用最低的成本去招最优秀的人才。本人从事嵌入式软件开发多年,结合自己的经验,推出了《嵌入式软件工程师技术面专题》,预计会有40篇,分成硬件协议、多进程多线程编程、网络编程、linux基础、C/C++等几大模块,每一篇在末尾都总结了相关提问,其中有些知识,即使是工作了两三年的同学也未必都懂,所以社招的同学也可以看,对于找工作绝对有帮助。**不打无准备之战,提前做好准备,方可立于不败之地**。欢迎大家订阅,只
2020-09-13 11:12:01
51355
73
原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(3) 守护进程
守护进程(daemon),是一种运行在后台 的特殊进程,它独立于控制终端 ,并周期性地执行某项任务或等待处理某些发生的事件。守护进程是个特殊的孤儿进程,这种进程脱离终端,为什么要脱离终端呢?之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在执行过程中的信息也不在任何终端上显示。由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。但是守护进程却能突破这种限制
2020-08-17 09:21:18
3993
4
原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(4) 进程同步和通信的方式有哪些?
🥇 作者简介: 热衷于知识探索和分享的技术博主。💂 csdn主页::【✍️ 微信公众号:【🎉精彩专栏:🎓 【 🧡 【 📚【 🌎【✍️ 【 …💂关于作者: 曾就职于国内知名安防上市公司,现就职于国内知名AMR机器人公司,担任高级系统软件工程师。2020年至今保持优快云博客专家,优快云 C/C++领域优质创作者头衔。全网5万+粉丝。十载寒冰,难凉热血;多年过去,历经变迁,物是人非。然而,对于技术的探索和追求从未停歇。💪坚持创作,热衷分享,初心未改,继往开来!
2020-08-16 16:27:48
11419
2
原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(15) 内核空间、用户空间、内核态、用户态
为了保证用户进程不能直接操作内核,保证内核安全,操作系统将虚拟空间划分为两部分,一部分是内核空间,一部分是用户空间。针对Linux操作系统,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF)供内核使用,称为内核空间,而较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。对于校招而言,该问题提问几率较大,因为是基础性问题,考察对内核空间和用户空间的理解,进程的内核态和用户态等概念。),进程切换时,用户空间切换,内核空间不变。
2020-08-16 16:18:39
15465
2
原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(13) 请你描述下进程虚拟内存空间布局
对于这个问题,面试官可能拿出一张白纸,让你尝试画出linux下进程的虚拟内存空间布局,然后=再让你简述下每个分区的作用,可能会挑几个重点分区,例如堆区、栈区来进行深入展开,考察你对堆栈的理解等等。文章目录1 内核空间2 栈(stack)3 内存映射段(mmap)4 堆(heap)5 BSS段6 数据段(Data)7 代码段(text)8 保留区问题提问在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中。这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4
2020-08-16 16:00:34
2415
2
原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(1) 进程和线程的基本概念与区别
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。线程(thread)是操作系统能够进行调度的最小单位。它被包含在进程之中,一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
2020-08-15 12:59:17
3697
2
原创 Linux C/C++ or 嵌入式面试之《网络编程系列》(4) tcp四次断开若干问题
首先A向B发送一个FIN报文段,报文段首部FIN=1,序列号seq=u(u为最后传送的数据的序列号加1,因为tcp规定,fin包消耗一个序列号,虽然没有发送数据),然后A进入FIN-WAIT-1(终止等待1)状态。(2)B收到释放连接的报文段后即发出确认报文段,报文首部ACK=1,ack=u+1,seq=v(v等于B前面传送过的数据的序列号加1),然后B进入CLOSE-WAIT(关闭等待)状态。(3)当A收到B的确认报文后,就进入FIN-WAIT-2(终止等待2)状态,等待B发出的连接释放报文段。
2020-08-15 12:52:33
15069
2
原创 蓝牙层级关系基本认知:L2CAP、LE 和 ACL
二、简单类比想象一下快递系统:L2CAP 的核心功能:四、数据流向对比场景1:经典蓝牙发送文件(ACL + L2CAP)场景2:BLE心率监测(LE + L2CAP)五、L2CAP 如何区分 ACL 和 LE在内核代码中 ():六、信道ID(CID)的分配标准CID分配:重要区别:ACL 使用的CID:0x0040-0xFFFF(动态分配)LE 专用的CID:0x0004、0x0005、0x0006(固定用途)七、实际连接建立过程对比ACL连接 + L2CAP信道建立:
2025-12-04 11:40:13
36
原创 蓝牙应用层协议GATT
GATT是 BLE 通信的数据交互规则。它基于客户端-服务器模型。数据采用的层级结构组织。是数据操作的基本单元,通过属性实现服务器主动推送,这是 BLE 应用中最常见的模式。理解了 GATT,你就掌握了 BLE 应用开发的精髓。元素Handle (句柄)UUID (通用唯一识别码)是什么数据的内存地址数据的类型说明特点简短的数字,在设备连接后动态发现较长的字符串,用于静态定义功能作用定位: “数据在哪里?识别: “这是什么数据?类比图书馆的索书号书的ISBN号或分类通信过程。
2025-11-09 19:19:57
1043
1
原创 蓝牙应用层dbus接口
是一个进程间通信(IPC)的系统,主要用于 Linux 桌面环境(如 GNOME, KDE)。它允许不同的应用程序相互通信、共享信息和调用彼此的功能。总线(Bus)系统总线(System Bus):用于系统级服务,如蓝牙、网络管理器、打印机服务。所有用户和应用程序都可以连接。会话总线(Session Bus):用于单个用户的桌面会话,实现同一用户下不同应用程序的通信。蓝牙服务在 Linux 上(通常由bluez实现)通过系统总线暴露其 API,任何想要使用蓝牙功能的应用程序都必须通过 DBus 与。
2025-11-08 23:52:02
1045
原创 bluetoothctl命令
这个工具提供了完整的蓝牙设备管理功能,从基本的开关控制到复杂的设备配对和连接管理。的高级管理工具,而非底层协议调试工具。支持的协议服务(UUID)
2025-11-08 23:47:46
831
原创 json处理不可见字符、转义字符
JSON 的 Unicode 支持使得它成为处理国际化数据的理想格式,只要遵循正确的编码和转义规则,就可以安全地处理全球任何语言的文本数据。JSON 对 Unicode 有完整的支持,遵循 UTF-8 编码标准,并提供多种方式来表示 Unicode 字符。格式表示 Unicode 字符,其中 XXXX 是 4 位十六进制数,不够的前面要补0。
2025-11-07 11:33:51
734
原创 zmq源码分析之io_object_t
类是 ZeroMQ I/O 体系中的核心基础类,为所有需要在 I/O 线程中运行的对象提供统一的管理接口。作为一个io对象,我们关心的无非是读和写。而什么时候可以读和写交由特定机制来监视,例如select、poll等,我们只需要实现读和写即可。这种设计使得 ZeroMQ 能够以高度模块化的方式构建复杂的网络应用,同时保持出色的性能表现。
2025-09-15 19:21:16
103
原创 国际金融机构预测年内黄金有望突破4000美元/盎司,折合国内是每克多少
这个计算涉及到几个关键的换算步骤和假设,下面是详细的推理过程:为了更直观地展示这个计算过程和各种因素的影响,请看下表:所以,综合来看,
2025-09-13 22:21:24
27772
原创 全球央行连续14个季度增持黄金
世界黄金协会的数据显示,自2020年第三季度以来,全球央行已连续14个季度净购入黄金。过去三年(2022-2024年),每年全球央行的购金量均超过1000吨,这几乎是此前十年年均水平的2倍。如果你对特定国家的数据感兴趣,或者想了解更多细节,世界黄金协会(World Gold Council)的官网通常会有更详细的月度或季度报告。全球央行近年来持续增持黄金,这反映了国际储备体系正在从美元主导的单一锚定,向多元化格局演变。在这一过程中,黄金作为独特的超主权货币,成为了过渡时期的“避风港”与“稳定锚”。
2025-09-13 22:13:32
1225
原创 中国央行已经连续10个月增持黄金
中国央行连续10个月增持黄金,是全球央行“去美元化”和储备多元化大趋势的一部分,也是为了优化自身储备结构、应对不确定性并为人民币国际化提供支持。虽然近期金价已处于历史高位,但市场对黄金的未来走势依然乐观。对于投资者而言,央行持续的购金行为或许能提供一个长期的参考视角。希望这些信息能帮助你更好地理解中国及全球的黄金储备动态。
2025-09-13 22:04:03
1709
原创 zmq源码分析之mailbox
总而言之,mailbox_t是 ZeroMQ 内部线程间命令传递的基础设施,是驱动整个 ZeroMQ 对象模型协作的“神经系统”。它通过 ypipe_t(命令队列) +signaler_t(事件通知)的核心组合,配合ctx_t的全局管理,实现了高效、灵活且线程安全的进程内通信机制。理解mailbox_t的工作机制,对于深入理解 ZeroMQ 如何协调 Socket、I/O 线程、Session、Engine 等组件至关重要。
2025-09-12 19:26:54
1042
原创 zmq源码分析之io_thread_t
是 ZeroMQ 异步架构的调度中心和运行时环境。它通过的机制,将外部的命令请求、内部的网络 I/O 事件和定时事件全部转化为统一的事件循环进行处理。它就像一个高效的工厂流水线调度员Mailbox是接收生产订单(命令)的窗口。Poller是监控所有机器(FD)状态的系统。in_event()是调度员处理订单、分配任务的核心逻辑。其他对象(Socket, Engine)则是流水线上的机器,在调度员的指挥下完成具体的工作。
2025-09-12 19:07:32
793
原创 zmq源码分析之session
Session 是 ZeroMQ 的核心抽象之一,它封装了单个网络连接的复杂性,为上层的 Socket 提供了统一、简洁的异步消息接口。模块化: 将网络 I/O (Engine)、连接管理 (Session)、消息队列 (Pipe) 和业务逻辑 (Socket) 清晰分离。可靠性: 通过状态机和优雅终止机制,尽力保证消息的可靠传递或清理。扩展性: 通过抽象的i_engine接口,可以轻松支持新的传输协议。透明性: 为上层应用隐藏了网络重连、认证等底层细节。
2025-09-12 17:31:18
778
原创 函数参数排序原则与设计指南
/ 输入参数(必需)→ 输入参数(可选)→ 输出参数 → 控制参数(如回调)bool processData(const std::vector<int>& inputData, // 必需输入int maxIterations = 100, // 可选输入Result* output = nullptr, // 输出参数ProgressCallback callback = nullptr // 控制参数通过遵循这些排序原则,函数接口将更直观、更安全,也更易于集成与扩展。
2025-09-10 10:26:57
76
原创 浅谈如何解决多组件系统相互依赖、调用导致接口复杂问题
通过统一的领域模型规范数据结构,并设计简洁的标准化接口,减少接口复杂度。具体做法梳理业务核心概念,定义统一的领域模型(如“用户”“订单”的属性和行为),确保各组件对数据的理解一致。基于领域模型设计接口,避免冗余字段(如接口仅返回必要的“订单ID”“状态”,而非全量信息)。接口版本控制:当业务变化时,通过版本号(如)管理接口迭代,避免频繁修改导致的混乱。优势:组件间基于共识的模型交互,减少沟通成本和接口适配工作量。通信上,通过协调层、事件驱动减少直接依赖;
2025-07-27 12:33:00
794
原创 面向对象分析与设计40讲(7)设计原则之合成复用原则
合成复用原则的核心是 “少用继承,多用组合继承是 “白箱复用”(子类可见父类内部),组合是 “黑箱复用”(仅通过接口使用)。在设计时,应优先考虑通过组合将不同功能模块化,让系统更灵活、更易维护。简单说:当你想 “这个类应该有某个功能” 时,先考虑 “能不能把这个功能做成对象,让类持有它”,而不是 “让类继承一个有这个功能的父类”。
2025-07-23 22:38:35
404
原创 面向对象分析与设计40讲(6)设计原则之开闭原则
这个实现的问题很明显:当需要新增一种图形(如三角形)时,必须修改ShapeCalculator类的calculateArea方法,添加新的判断分支,这就违反了 “对修改关闭” 的原则。具体来说,一个软件实体(如类、模块、函数等)应当允许在不修改其源代码的前提下,通过扩展的方式来新增功能。,通过定义抽象的接口或基类,让具体实现类去继承和扩展,而高层模块只依赖于抽象,不依赖具体实现。开闭原则是一种结果,一种指导思想,并非手段,想实现开闭原则,还得借助抽象来实现。实现开闭原则的关键是。
2025-07-22 23:10:18
200
原创 软件天生的复杂性
软件复杂性的本质是**“目标(需求)的不确定性”“实现(技术)的局限性”“协作(团队)的低效性”三者的叠加**。它不是某一个环节的问题,而是从需求定义到系统退役的全生命周期中,各种因素累积的结果。理解这些原因的价值在于:解决复杂性需“对症下药”——需求层面需明确边界,技术层面需控制债务,团队层面需降低沟通成本,最终实现“复杂性可控”而非“完全消除”。
2025-07-20 16:50:51
481
原创 库软件(Library Software)的核心特性与开发原则
库软件的本质是**“基础设施级的复用资产”**:其需求由依赖关系决定,其可靠性由契约和稳定性保障,其价值由易用性体现。这种定位要求库开发必须跳出“单一应用视角”,以“全局复用”为目标,通过专业化团队、严格的设计规范和长期维护,成为支撑整个技术生态的“基石”。正如Linux内核的发展逻辑——“一次做好,持续兼容”,库的价值不在于短期交付,而在于长期降低整个系统的开发与维护成本。
2025-07-17 13:30:23
775
原创 可复用软件的构建本质是组织能力的重构
可复用软件的构建本质是组织能力的重构:它需要打破部门壁垒、建立专业化分工、设计合理的激励机制,并借助技术工具实现效率跃迁。尽管初期投入较高,但复用组件的长期价值远超短期成本。正如C++标准库的优秀的复用设计不仅是技术问题,更是战略选择。企业需从“项目制思维”转向“资产化运营”,将复用能力纳入核心竞争力建设,方能在数字化浪潮中实现可持续发展。
2025-07-17 11:32:42
691
原创 std::vector<bool>有什么特殊的吗
但也带来了与标准容器不一致的行为。在实际开发中,需谨慎评估其适用性,必要时选择替代方案以避免潜在问题。理解其特性是编写健壮C++代码的关键。是标准库中的一个特殊容器,它虽然看似是存储布尔值的动态数组,但实际上是一个。每个布尔值(通常8个布尔值压缩为1字节),以节省内存空间。这些差异可能导致一些反直觉的行为,需特别注意。某些需要直接访问内存地址的算法(如。的迭代器返回的是代理对象,而非。由于位压缩存储,无法提供真正的。
2025-07-06 23:09:47
428
原创 linux/ubuntu日志管理--/dev/log 的本质与作用
是Linux系统中实现进程间通信(IPC)的一种特殊文件。它为应用程序提供了向系统日志服务(如rsyslogd、systemd-journald)发送日志的标准接口。系统之所以定义了这个,是想规范应用程序输出日志的接口,日志服务会持续迭代演变,但只要接口未变,应用程序的日志调用接口就不用修改,日志输出还会被记录。通常是一个指向实际套接字文件的符号链接。传递给当前系统的日志服务。编译后运行,日志会通过。
2025-07-06 12:30:14
636
原创 单用户模式、紧急模式、救援模式有什么区别
通过合理使用这三种模式,可有效解决Linux系统的各类启动和配置故障,确保系统恢复正常运行。通过修改GRUB启动参数。
2025-07-05 23:55:51
1553
原创 getaddrinfo工作原理分析
函数时,是否会发起网络通信取决于具体情况。(内存或文件),查看是否有最近解析过的域名记录。如果命中缓存,直接返回结果,文件,看是否存在域名到IP的静态映射。会调用系统的DNS解析器(通常是。如果缓存未命中,系统会检查本地的。如果找到匹配项,直接返回结果,获取DNS服务器地址(如。到配置的DNS服务器(如。如果前两步都未找到结果,
2025-07-04 18:04:29
547
原创 linux/ubuntu启动引导过程详细分析
Ubuntu的启动流程通过模块化设计和systemd的并行机制,在保证稳定性的同时,大幅提升了启动效率。理解各阶段的功能和依赖关系,有助于系统管理员进行性能优化和故障定位。作为init系统(PID=1),替代传统的SysV init,负责系统服务启动和管理。作为引导加载程序,负责加载内核和初始化参数。Ubuntu自15.04版本起使用。Ubuntu默认使用。
2025-07-04 16:34:18
1015
原创 计算机科学导论(1)哈佛架构
哈佛架构(Harvard Architecture)是一种将程序指令存储和数据存储分开的计算机体系结构。其名称源于1944年哈佛大学开发的“马克一号”(Harvard Mark I)计算机,该架构与传统的冯·诺依曼架构形成鲜明对比,核心设计目标是提升数据处理效率和系统性能。哈佛架构通过“存储与总线分离”的设计,从硬件层面解决了冯·诺依曼架构的“总线瓶颈”问题,成为高性能计算、嵌入式系统和专用处理器的核心架构之一。其核心思想——将指令与数据的处理路径分离以实现并行性——至今仍是计算机体系结构优化的重要方向。
2025-07-04 15:11:35
1328
原创 udev 规则文件命名规范
数字前缀建议使用90-99,避免与系统规则冲突。描述性名称需清晰表达规则用途,例如:udev 规则文件名以数字开头的设计,本质是为了精确控制规则执行顺序和提升管理效率。通过数字前缀的优先级机制,系统可按设备初始化逻辑加载规则,确保硬件识别和配置的稳定性;而描述性名称则帮助管理员快速定位规则功能,降低维护成本。这一规范是 Linux 设备管理体系中“约定优于配置”的典型体现。
2025-07-04 11:45:32
945
原创 udev介绍与规则书写--Linux 系统中动态设备管理的核心组件
udev通过“动态映射+规则配置”的模式,解决了传统Linux设备管理的两大痛点:静态命名的随机性与权限管理的复杂性。从嵌入式设备到数据中心服务器,udev已成为Linux系统中硬件抽象的核心组件。理解其工作原理与规则编写方法,不仅能解决设备识别难题,更能为自动化部署、多设备管理等场景提供高效解决方案。
2025-07-04 11:25:12
877
原创 计算机科学导论(10)什么是BIOS
BIOS是计算机启动的“基石”,在硬件与系统间扮演着桥梁角色,但受限于技术架构,逐渐被更先进的UEFI替代。理解BIOS的原理,有助于排查计算机启动故障、优化硬件配置,以及理解现代固件技术的演进逻辑。
2025-07-03 23:24:19
1028
原创 locate 命令更新机制详解
Linux 系统通常通过 crontab 定时任务 自动执行 命令,确保数据库与文件系统同步。该任务的配置文件一般位于:其中: 表示每天凌晨4点执行; 参数为静默模式,减少日志输出。二、定时任务的配置逻辑执行频率:权限控制:除定时任务外,系统还可能通过以下方式触发 :软件包管理器联动:手动触发场景:文件系统事件监控: 在扫描时会通过以下方式减少系统负担:排除指定目录:增量扫描策略:IO 优先级控制:数据库更新延迟导致查询失效:定时任务未执行排查:自定义更新频率:总
2025-07-03 23:10:38
854
原创 locate命令的原理是啥
将实时搜索转化为快速查询,适用于需要频繁查找已知文件名的场景。但需注意其时效性依赖数据库更新,且功能局限于路径匹配。若需复杂条件检索或实时结果,仍需使用。命令是Linux系统中用于快速查找文件或目录的工具,其原理主要围绕。命令的高效性源于它不直接遍历文件系统,而是查询。命令的核心优势在于通过。
2025-07-03 23:10:01
365
原创 ubuntu网络管理五花八门netplan 、NetworkManager、systemd、networking是什么关系
A: Netplan 只是生成配置,实际管理由底层工具(NetworkManager 或 systemd-networkd)执行。如果需要更详细的配置示例,可以参考 Netplan 官方文档或 Ubuntu 网络管理指南。,它们各自有不同的作用,但也可以协同工作。A: 可能是 YAML 缩进错误,或底层服务未重启。Ubuntu 的网络管理确实涉及多个组件,包括。修改,可能会覆盖 Netplan 的配置。
2025-06-19 23:16:47
1617
有初学C++ C linux 嵌入式的吗,这里集合,有大量系统学习的博客教程
2021-04-12
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅