
嵌入式/Linux C/C++软件工程师知识体系(包括面试)
文章平均质量分 81
面向Linux C/C++软件工程师,内容涵盖面试、笔试常见问题,以及实际工作问题,致力于打造Linux开发知识库
优惠券已抵扣
余额抵扣
还需支付
¥59.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
奇妙之二进制
csdn博客专家,C/C++领域优质创作者,专注于Linux C/C++、嵌入式Linux开发,偶尔谈谈人生,目前致力于完成大约500篇的linux C/C++开发知识体系库,所有的文章都会一直保持更新(优化内容、排版),想学习的可以订阅我的专栏。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Linux C/C++ or 嵌入式面试之《C/C++笔面试系列》(1) C语言经典笔面试题(上)
C语言是嵌入式开发的常用语言,也是主要语言,很多企业在招聘嵌入式软件工程师时,C语言的熟练程度是一个重要考察点。笔试也是以C语言为主,所以想要拿到面试机会,还得通过C语言笔试,本专题总结了各大企业C语言笔面试常见的考题,并做了详细解答。文章目录1、sizeof在什么阶段执行?它是函数还是啥?2、指针的指针3、什么是大小端?写一个简单的程序判断系统的大小端。4、用变量a定义5、位操作6、符号转换7、typedef和define的区别8、C语言程序代码优化方法9、关键字static的作用10、const的使用原创 2020-08-16 13:17:29 · 33274 阅读 · 4 评论 -
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 · 2318 阅读 · 2 评论 -
Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(11) linux下线程同步/互斥方式有哪些?
线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点。linux下提供了多种方式来处理线程同步,最常用的是互斥锁、条件变量和信号量。面试基本不会考察接口使用,更侧重会实现原理。文章目录一、互斥锁二、条件变量(cond)三、信号量(sem)四、理解PV操作问题汇总一、互斥锁通过锁机制实现线程间的同步。初始化锁在Linux下,线程的互斥量数据类型是pthread_mutex_t。在使用前,要对它进行初始化。静态分配:pthread_mutex_t mutex = PTHREAD_M原创 2020-08-18 15:26:56 · 11784 阅读 · 3 评论 -
Linux C/C++ or 嵌入式面试之《C/C++笔面试系列》(10) C++ 前置后置增减运算符重载形式与比较
C语言的++、–运算符在此不讨论。文章目录1、前置后置增减运算符重载的形式2、前置和后置运算符的性能比较1、前置后置增减运算符重载的形式自增运算符“++”和自减运算符“–”分别包含两个版本。即运算符前置形式(如 ++x)和运算符后置形式(如 x++),这两者进行的操作是不一样的。因此,当我们在对这两个运算符进行重载时,就必须区分前置和后置形式。C++根据参数的个数来区分前置和后置形式。如果按照通常的方法来重载 ++ 运算符(即作为成员函数重载时不带参数,或者作为非成员函数重载时带有一个参数),那么重载原创 2020-09-01 19:13:14 · 5555 阅读 · 3 评论 -
面向对象分析与设计40讲(7)设计原则之合成复用原则
合成复用原则的核心是 “少用继承,多用组合继承是 “白箱复用”(子类可见父类内部),组合是 “黑箱复用”(仅通过接口使用)。在设计时,应优先考虑通过组合将不同功能模块化,让系统更灵活、更易维护。简单说:当你想 “这个类应该有某个功能” 时,先考虑 “能不能把这个功能做成对象,让类持有它”,而不是 “让类继承一个有这个功能的父类”。原创 2025-07-23 22:38:35 · 166 阅读 · 0 评论 -
面向对象分析与设计40讲(6)设计原则之开闭原则
这个实现的问题很明显:当需要新增一种图形(如三角形)时,必须修改ShapeCalculator类的calculateArea方法,添加新的判断分支,这就违反了 “对修改关闭” 的原则。具体来说,一个软件实体(如类、模块、函数等)应当允许在不修改其源代码的前提下,通过扩展的方式来新增功能。,通过定义抽象的接口或基类,让具体实现类去继承和扩展,而高层模块只依赖于抽象,不依赖具体实现。开闭原则是一种结果,一种指导思想,并非手段,想实现开闭原则,还得借助抽象来实现。实现开闭原则的关键是。原创 2025-07-22 23:10:18 · 70 阅读 · 0 评论 -
软件天生的复杂性
软件复杂性的本质是**“目标(需求)的不确定性”“实现(技术)的局限性”“协作(团队)的低效性”三者的叠加**。它不是某一个环节的问题,而是从需求定义到系统退役的全生命周期中,各种因素累积的结果。理解这些原因的价值在于:解决复杂性需“对症下药”——需求层面需明确边界,技术层面需控制债务,团队层面需降低沟通成本,最终实现“复杂性可控”而非“完全消除”。原创 2025-07-20 16:50:51 · 281 阅读 · 0 评论 -
库软件(Library Software)的核心特性与开发原则
库软件的本质是**“基础设施级的复用资产”**:其需求由依赖关系决定,其可靠性由契约和稳定性保障,其价值由易用性体现。这种定位要求库开发必须跳出“单一应用视角”,以“全局复用”为目标,通过专业化团队、严格的设计规范和长期维护,成为支撑整个技术生态的“基石”。正如Linux内核的发展逻辑——“一次做好,持续兼容”,库的价值不在于短期交付,而在于长期降低整个系统的开发与维护成本。原创 2025-07-17 13:30:23 · 704 阅读 · 0 评论 -
可复用软件的构建本质是组织能力的重构
可复用软件的构建本质是组织能力的重构:它需要打破部门壁垒、建立专业化分工、设计合理的激励机制,并借助技术工具实现效率跃迁。尽管初期投入较高,但复用组件的长期价值远超短期成本。正如C++标准库的优秀的复用设计不仅是技术问题,更是战略选择。企业需从“项目制思维”转向“资产化运营”,将复用能力纳入核心竞争力建设,方能在数字化浪潮中实现可持续发展。原创 2025-07-17 11:32:42 · 553 阅读 · 0 评论 -
C++中NULL等于啥
C++标准(如C++20 §17.2)规定:The macro。原创 2025-07-06 23:25:33 · 118 阅读 · 0 评论 -
std::vector<bool>有什么特殊的吗
但也带来了与标准容器不一致的行为。在实际开发中,需谨慎评估其适用性,必要时选择替代方案以避免潜在问题。理解其特性是编写健壮C++代码的关键。是标准库中的一个特殊容器,它虽然看似是存储布尔值的动态数组,但实际上是一个。每个布尔值(通常8个布尔值压缩为1字节),以节省内存空间。这些差异可能导致一些反直觉的行为,需特别注意。某些需要直接访问内存地址的算法(如。的迭代器返回的是代理对象,而非。由于位压缩存储,无法提供真正的。原创 2025-07-06 23:09:47 · 268 阅读 · 0 评论 -
linux/ubuntu日志管理--/dev/log 的本质与作用
是Linux系统中实现进程间通信(IPC)的一种特殊文件。它为应用程序提供了向系统日志服务(如rsyslogd、systemd-journald)发送日志的标准接口。系统之所以定义了这个,是想规范应用程序输出日志的接口,日志服务会持续迭代演变,但只要接口未变,应用程序的日志调用接口就不用修改,日志输出还会被记录。通常是一个指向实际套接字文件的符号链接。传递给当前系统的日志服务。编译后运行,日志会通过。原创 2025-07-06 12:30:14 · 523 阅读 · 0 评论 -
udev 规则文件命名规范
数字前缀建议使用90-99,避免与系统规则冲突。描述性名称需清晰表达规则用途,例如:udev 规则文件名以数字开头的设计,本质是为了精确控制规则执行顺序和提升管理效率。通过数字前缀的优先级机制,系统可按设备初始化逻辑加载规则,确保硬件识别和配置的稳定性;而描述性名称则帮助管理员快速定位规则功能,降低维护成本。这一规范是 Linux 设备管理体系中“约定优于配置”的典型体现。原创 2025-07-04 11:45:32 · 690 阅读 · 0 评论 -
udev介绍与规则书写--Linux 系统中动态设备管理的核心组件
udev通过“动态映射+规则配置”的模式,解决了传统Linux设备管理的两大痛点:静态命名的随机性与权限管理的复杂性。从嵌入式设备到数据中心服务器,udev已成为Linux系统中硬件抽象的核心组件。理解其工作原理与规则编写方法,不仅能解决设备识别难题,更能为自动化部署、多设备管理等场景提供高效解决方案。原创 2025-07-04 11:25:12 · 681 阅读 · 0 评论 -
getaddrinfo工作原理分析
函数时,是否会发起网络通信取决于具体情况。(内存或文件),查看是否有最近解析过的域名记录。如果命中缓存,直接返回结果,文件,看是否存在域名到IP的静态映射。会调用系统的DNS解析器(通常是。如果缓存未命中,系统会检查本地的。如果找到匹配项,直接返回结果,获取DNS服务器地址(如。到配置的DNS服务器(如。如果前两步都未找到结果,原创 2025-07-04 18:04:29 · 333 阅读 · 0 评论 -
ubuntu网络管理五花八门netplan 、NetworkManager、systemd、networking是什么关系
A: Netplan 只是生成配置,实际管理由底层工具(NetworkManager 或 systemd-networkd)执行。如果需要更详细的配置示例,可以参考 Netplan 官方文档或 Ubuntu 网络管理指南。,它们各自有不同的作用,但也可以协同工作。A: 可能是 YAML 缩进错误,或底层服务未重启。Ubuntu 的网络管理确实涉及多个组件,包括。修改,可能会覆盖 Netplan 的配置。原创 2025-06-19 23:16:47 · 1001 阅读 · 0 评论 -
NetworkManager介绍与用法
NetworkManager 是 Linux 上最强大的网络管理工具之一,适用于桌面和服务器环境,支持动态网络切换、VPN、DNS 管理等。通过nmclinmtui或 GUI 工具,用户可以灵活配置网络,而高级用户可通过配置文件进一步定制行为。原创 2025-06-19 23:15:40 · 761 阅读 · 0 评论 -
编译链接实战(16)常见编译器内置属性修饰符
请记住,全局变量的初始化顺序是依赖于编译器和链接器的具体实现的,可能在不同的编译器和平台上有所不同。需要注意的是,初始化函数的优先级仅用于确定它们的执行顺序,并不表示初始化的速度。默认情况下,没有指定优先级的初始化函数被视为具有中等优先级(0),而通过显式设置优先级,可以控制初始化函数的执行顺序。特性为开发者提供了一种方便的方式来定义在程序启动时自动执行的初始化函数,使得全局的初始化工作变得更加简单和方便。是GCC和兼容的编译器中的一个特性,用于指示编译器将一个函数标记为在程序启动时自动执行的初始化函数。原创 2023-11-23 20:14:00 · 2058 阅读 · 0 评论 -
编译链接实战(32)再探动态库的本质和原理
其核心依赖位置无关代码(PIC)和动态符号解析机制。相比静态库,动态库在资源利用和灵活性上优势明显,但需要处理依赖管理和ABI兼容性问题。理解其原理有助于优化程序部署和维护。,其核心原理是通过操作系统的动态链接机制实现代码的共享和灵活更新。多个进程可共享同一动态库的代码段(只读),数据段每进程独立(Copy-on-Write)。存储导出的函数/变量符号(供其他程序调用)和依赖的外部符号(如。动态库(Dynamic Library,也称共享库)的本质是。记录运行时需要修正的地址(如外部函数调用)。原创 2025-06-15 18:04:51 · 107 阅读 · 0 评论 -
编译链接实战(31)再探静态库的本质和原理
静态库的本质是。原创 2025-06-15 16:47:16 · 86 阅读 · 0 评论 -
编译链接实战(30)strip移除了哪些内容
合理使用可减小发布体积,但需确保不破坏关键功能(如动态链接)。调试时可通过外部符号文件(如。)中的调试信息和符号表,以减少文件体积并提高安全性。命令主要用于移除二进制文件(如可执行文件、动态库。部分情况下会被移除,影响 C++ 异常回溯。,但对运行必需的动态符号(原创 2025-06-15 16:03:08 · 132 阅读 · 0 评论 -
编译链接实战(29)了解什么是ABI(应用程序二进制接口)
ABI(Application Binary Interface,应用程序二进制接口)是软件系统中不同模块之间的底层接口规范,定义了二进制层面的交互规则。它与API(Application Programming Interface)不同,API关注源代码级别的交互,而ABI关注的是编译后的二进制代码如何协同工作。ABI是软件生态的“隐形契约”,确保二进制组件无缝协作。理解ABI有助于解决链接错误、性能优化(如避免不必要的参数传递开销)以及跨平台/语言开发问题。原创 2025-06-15 15:47:28 · 68 阅读 · 0 评论 -
编译链接实战(28)链接动态库时(-l选项),背后做了哪些事
检查。原创 2025-06-15 15:39:25 · 60 阅读 · 0 评论 -
编译链接实战(27)动态库实现变了,可执行程序需要重新编译吗
是结构体的第一个成员,但动态库已交换顺序,导致内存解析错误。:动态库内部实现改变但接口不变时,可执行程序无需重新编译。:必须修改代码或恢复动态库的符号。下面通过具体的代码示例来验证。符号,导致运行时链接失败。:必须重新编译可执行程序。原创 2025-06-15 15:37:22 · 83 阅读 · 0 评论 -
coredump文件的原理是啥
Core Dump(核心转储)是操作系统在程序崩溃(如段错误、非法指令等)时自动生成的一个文件,它包含了程序崩溃瞬间的。通过 core dump,开发者可以像“时间回溯”一样检查程序崩溃瞬间的状态,是调试复杂问题的利器!终止时,Linux 内核会生成 core 文件。不会生成 core dump,因为它们是“优雅终止”信号。这样 core 文件会直接压缩存储,节省磁盘空间。的文件(类似可执行文件),可以用。Core 文件本质上是一个。原创 2025-06-08 09:55:49 · 93 阅读 · 0 评论 -
自顶向下与自底向上编程思想的对比
一、核心定义与本质差异自顶向下编程思想如同绘制一幅完整的地图,从整体轮廓逐步细化到局部细节。其本质是从系统的整体目标出发,通过逐层分解将复杂问题简化为可实现的子问题,强调先定义 “做什么”,再考虑 “如何做”。自底向上编程思想则类似于搭建积木,从基础组件开始逐步构建复杂系统。其本质是从现有资源和基础功能出发,通过组合和扩展简单组件来实现复杂功能,强调先解决 “如何做” 的细节,再整合为 “做什么” 的整体。二、设计起点与逻辑流程对比设计起点:以系统的整体目标和业务需求为起点。例如设计一个电商平台,首先明确原创 2025-05-28 17:35:45 · 471 阅读 · 0 评论 -
C语言入门教程100讲(0)从了解C语言的发展史开始
C语言从诞生至今已经有了超过五十年的历史,它不仅影响了编程语言的发展,还对操作系统、计算机架构以及软件工程产生了深远的影响。无论是对于程序员还是计算机科学研究者,C语言都是一门必须掌握的语言,它的简洁、灵活和高效使其在许多领域中依然保持着强大的生命力。原创 2025-03-29 19:33:52 · 165 阅读 · 0 评论 -
C语言入门教程100讲(40)文件定位
文件定位是指在文件中移动文件指针的位置,以便从指定位置开始读写文件。C 语言提供了fseekftell和rewind等函数来实现文件定位。原创 2025-03-24 23:24:31 · 283 阅读 · 0 评论 -
C语言入门教程100讲(39)文件读写
函数可以从文件中读取一行字符串。函数可以向文件中写入一行字符串。函数可以从文件中格式化读取数据。函数可以向文件中格式化写入数据。函数可以从文件中读取二进制数据。函数可以向文件中写入二进制数据。函数可以从文件中读取一个字符。函数可以向文件中写入一个字符。原创 2025-03-23 22:40:47 · 197 阅读 · 0 评论 -
C语言入门教程100讲(38)文件打开与关闭
文件操作是指通过程序对文件进行读写、创建、删除等操作。C 语言提供了标准库函数来处理文件操作,主要包括文件的打开、关闭、读写等。原创 2025-03-23 16:05:33 · 230 阅读 · 0 评论 -
C语言入门教程100讲(37) typedef
typedef是 C 语言中的关键字,用于为已有的数据类型定义一个新的名称(别名)。通过typedef,可以简化复杂数据类型的声明,提高代码的可读性。可以在定义结构体时直接使用typedefint age;} Student;// 定义 Student 为匿名结构体的别名可以。例如:typedef int IntArray[10];// 定义 IntArray 为 int[10] 的别名// 使用 IntArray 声明数组。原创 2025-03-23 16:03:45 · 153 阅读 · 0 评论 -
C语言入门教程100讲(36)结构体与函数
结构体可以作为函数参数传递,以便在函数内部访问或修改结构体的成员。结构体参数可以按值传递,也可以按引用传递(通过指针)。按引用传递结构体(通过指针)可以避免复制整个结构体,并允许函数内部修改结构体的成员。按值传递结构体会复制整个结构体,函数内部对结构体的修改不会影响实参。函数可以返回结构体指针,但需要确保返回的指针指向有效的内存地址。函数可以返回结构体,以便将计算结果封装在结构体中返回。原创 2025-03-23 16:02:01 · 230 阅读 · 0 评论 -
C语言入门教程100讲(35)结构体与指针
结构体指针是指向结构体变量的指针。通过结构体指针,可以访问和操作结构体的成员。原创 2025-03-23 16:00:43 · 431 阅读 · 0 评论 -
C语言入门教程100讲(34)结构体初始化
结构体初始化是指在声明结构体变量时为其成员赋初值的过程。C 语言提供了多种初始化结构体的方式,包括直接初始化、指定成员初始化和动态初始化。原创 2025-03-23 15:59:49 · 134 阅读 · 0 评论 -
C语言入门教程100讲(33)结构体定义
结构体是 C 语言中用于组合多个不同类型数据的一种复合数据类型。通过结构体,可以将相关的数据项组织在一起,便于管理和操作。struct 结构体名 {数据类型 成员1;数据类型 成员2;...int age;原创 2025-03-23 15:58:05 · 101 阅读 · 0 评论 -
C语言入门教程100讲(32)多级指针
多级指针是指指向指针的指针。int *ptr,指向int类型的变量。int **ptr,指向int *类型的指针。int ***ptr,指向int **类型的指针。原创 2025-03-23 15:56:19 · 312 阅读 · 0 评论 -
C语言入门教程100讲(31)指针与函数
指针可以作为函数参数传递,以便在函数内部修改实参的值。通过指针传递参数,可以实现对实参的直接操作。函数可以返回指针,但需要确保返回的指针指向有效的内存地址。数组作为函数参数时,实际上传递的是数组的首地址。函数指针是指向函数的指针,可以用于动态调用函数。原创 2025-03-23 15:54:37 · 83 阅读 · 0 评论 -
C语言入门教程100讲(30)指针与数组
在 C 语言中,数组名是一个指向数组首元素的常量指针。因此,指针和数组可以互换使用,通过指针可以访问和操作数组的元素。数组作为函数参数时,实际上传递的是数组的首地址。因此,函数内部可以通过指针访问数组元素。指针算术是指对指针进行加减操作,以访问数组中的其他元素。数组名表示数组的首地址,可以赋值给指针变量。数组名和指针在大多数情况下可以互换使用。指针数组是一个数组,其元素是指针。数组指针是一个指针,指向一个数组。可以通过指针访问数组元素。可以使用指针遍历数组。原创 2025-03-23 15:53:48 · 100 阅读 · 0 评论 -
C语言入门教程100讲(29)指针运算
指针运算是指对指针进行加减操作,以访问相邻的内存地址。指针运算通常用于遍历数组或动态内存操作。原创 2025-03-23 15:53:04 · 80 阅读 · 0 评论 -
C语言入门教程100讲(28)指针基础
指针是 C 语言中用于存储内存地址的变量。通过指针,可以直接访问和操作内存中的数据。原创 2025-03-23 15:52:10 · 103 阅读 · 0 评论