- 博客(1183)
- 资源 (4)
- 问答 (1)
- 收藏
- 关注

原创 Linux系统软件工程师/嵌入式Linux应用开发工程师 知识体系构建 500篇(持续更新)
今年受疫情影响,企业经营必不可免地受到冲击,企业在选人用人方面比以往都更加谨慎,招聘也更加苛刻。hr都试图用最低的成本去招最优秀的人才。本人从事嵌入式软件开发多年,结合自己的经验,推出了《嵌入式软件工程师技术面专题》,预计会有40篇,分成硬件协议、多进程多线程编程、网络编程、linux基础、C/C++等几大模块,每一篇在末尾都总结了相关提问,其中有些知识,即使是工作了两三年的同学也未必都懂,所以社招的同学也可以看,对于找工作绝对有帮助。**不打无准备之战,提前做好准备,方可立于不败之地**。欢迎大家订阅,只
2020-09-13 11:12:01
51045
73

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(3) 守护进程
守护进程(daemon),是一种运行在后台 的特殊进程,它独立于控制终端 ,并周期性地执行某项任务或等待处理某些发生的事件。守护进程是个特殊的孤儿进程,这种进程脱离终端,为什么要脱离终端呢?之所以脱离于终端是为了避免进程被任何终端所产生的信息所打断,其在执行过程中的信息也不在任何终端上显示。由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。但是守护进程却能突破这种限制
2020-08-17 09:21:18
3825
4

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(4) 进程同步和通信的方式有哪些?
🥇 作者简介: 热衷于知识探索和分享的技术博主。💂 csdn主页::【✍️ 微信公众号:【🎉精彩专栏:🎓 【 🧡 【 📚【 🌎【✍️ 【 …💂关于作者: 曾就职于国内知名安防上市公司,现就职于国内知名AMR机器人公司,担任高级系统软件工程师。2020年至今保持CSDN博客专家,CSDN C/C++领域优质创作者头衔。全网5万+粉丝。十载寒冰,难凉热血;多年过去,历经变迁,物是人非。然而,对于技术的探索和追求从未停歇。💪坚持创作,热衷分享,初心未改,继往开来!
2020-08-16 16:27:48
11340
2

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(15) 内核空间、用户空间、内核态、用户态
为了保证用户进程不能直接操作内核,保证内核安全,操作系统将虚拟空间划分为两部分,一部分是内核空间,一部分是用户空间。针对Linux操作系统,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF)供内核使用,称为内核空间,而较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。对于校招而言,该问题提问几率较大,因为是基础性问题,考察对内核空间和用户空间的理解,进程的内核态和用户态等概念。),进程切换时,用户空间切换,内核空间不变。
2020-08-16 16:18:39
15306
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
2281
2

原创 Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(1) 进程和线程的基本概念与区别
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。线程(thread)是操作系统能够进行调度的最小单位。它被包含在进程之中,一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
2020-08-15 12:59:17
3527
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
14973
2
原创 core文件的原理是啥
Core Dump(核心转储)是操作系统在程序崩溃(如段错误、非法指令等)时自动生成的一个文件,它包含了程序崩溃瞬间的。通过 core dump,开发者可以像“时间回溯”一样检查程序崩溃瞬间的状态,是调试复杂问题的利器!终止时,Linux 内核会生成 core 文件。不会生成 core dump,因为它们是“优雅终止”信号。这样 core 文件会直接压缩存储,节省磁盘空间。的文件(类似可执行文件),可以用。Core 文件本质上是一个。
2025-06-08 09:55:49
39
原创 软件功能模块归属论证方法
在讨论软件功能点应该归属哪些模块时,并没有放之四海而皆准的固定方法,但可以通过系统化的论证和设计原则来做出合理决策。以下是常见的论证方法和关键考虑因素:单一职责原则 (SRP)高内聚低耦合复用性领域驱动设计 (DDD)功能相关性分析变更影响评估性能与数据局部性团队协作边界分层架构约束没有绝对正确的答案,但可通过以下步骤决策:最终目标是实现可维护性、可扩展性和团队协作效率的平衡。
2025-06-06 22:46:15
388
原创 低内聚高耦合的衡量指标
程度需要通过具体的指标和观察点来判断。内聚性指模块内部元素(函数、类、组件)之间的功能相关性。低内聚表现为模块职责分散、功能混杂。耦合度指模块间依赖关系的强度。高耦合表现为模块间直接依赖过多,难以独立修改或替换。通过量化指标和设计原则,可以客观评估系统的内聚和耦合问题,并针对性优化。
2025-06-06 22:45:06
509
原创 Linux平台排查CPU占用高的进程和线程指南
定位高CPU进程:使用top/htop/ps找出问题进程分析进程线程:top -H/ps -T查看线程情况检查调用栈:使用gdb/perf分析执行路径监控系统调用:strace跟踪具体行为检查依赖资源:查看是否因等待IO/锁等导致分析日志:检查系统日志和应用日志。
2025-06-03 21:32:54
424
原创 virtualbox安装扩展工具以支持共享文件夹
https://download.virtualbox.org/virtualbox/7.0.16/
2025-06-03 21:24:46
192
原创 软件工程的定义与发展历程
软件工程是应用系统化、规范化、可量化的方法来开发、运行和维护软件的学科。它结合了计算机科学、项目管理、工程实践和其他相关领域的知识,旨在高效地生产高质量、可靠的软件系统。“将系统化的、规范的、可度量的方法应用于软件的开发、运行和维护的过程,即将工程化应用于软件。系统性:采用结构化的方法和流程规范性:遵循既定的标准和规范可量化:能够对过程和产品进行测量和评估多学科交叉:融合计算机科学、数学、工程学和管理学。
2025-06-03 21:08:38
979
原创 Ubuntu20.04服务器开启路由转发让局域网内其他电脑通过该服务器连接外网
这样,你的设备就能通过 Ubuntu 的 Wi-Fi 上网了!(Wi-Fi)访问互联网。,通过 Wi-Fi 上网,并给连接到。,使其看起来是从 Ubuntu 的。(外网)转发时,自动修改数据包的。的核心规则,用于让连接到。(有线网络)的设备通过。
2025-05-30 14:03:53
1205
原创 自顶向下与自底向上编程思想的对比
一、核心定义与本质差异自顶向下编程思想如同绘制一幅完整的地图,从整体轮廓逐步细化到局部细节。其本质是从系统的整体目标出发,通过逐层分解将复杂问题简化为可实现的子问题,强调先定义 “做什么”,再考虑 “如何做”。自底向上编程思想则类似于搭建积木,从基础组件开始逐步构建复杂系统。其本质是从现有资源和基础功能出发,通过组合和扩展简单组件来实现复杂功能,强调先解决 “如何做” 的细节,再整合为 “做什么” 的整体。二、设计起点与逻辑流程对比设计起点:以系统的整体目标和业务需求为起点。例如设计一个电商平台,首先明确
2025-05-28 17:35:45
434
原创 Python 列表推导式:让代码更简洁高效的魔法语法
列表推导式(List Comprehension)是 Python 提供的一种。,掌握它能让你的代码更 Pythonic!它可以用一行代码替代传统的。由于 Python 内部优化,列表推导式比。,如果要在循环内修改外部变量,应该用。方法,让代码更简洁、运行更快。逻辑更紧凑,减少冗余代码,适合。列表推导式是 Python 的。,尤其在大数据量时更明显。虽然列表推导式很强大,但。
2025-05-19 11:45:57
302
原创 C语言入门教程100讲(0)从了解C语言的发展史开始
C语言从诞生至今已经有了超过五十年的历史,它不仅影响了编程语言的发展,还对操作系统、计算机架构以及软件工程产生了深远的影响。无论是对于程序员还是计算机科学研究者,C语言都是一门必须掌握的语言,它的简洁、灵活和高效使其在许多领域中依然保持着强大的生命力。
2025-03-29 19:33:52
135
原创 C语言入门教程100讲(40)文件定位
文件定位是指在文件中移动文件指针的位置,以便从指定位置开始读写文件。C 语言提供了fseekftell和rewind等函数来实现文件定位。
2025-03-24 23:24:31
230
原创 C语言入门教程100讲(39)文件读写
函数可以从文件中读取一行字符串。函数可以向文件中写入一行字符串。函数可以从文件中格式化读取数据。函数可以向文件中格式化写入数据。函数可以从文件中读取二进制数据。函数可以向文件中写入二进制数据。函数可以从文件中读取一个字符。函数可以向文件中写入一个字符。
2025-03-23 22:40:47
171
原创 C语言入门教程100讲(38)文件打开与关闭
文件操作是指通过程序对文件进行读写、创建、删除等操作。C 语言提供了标准库函数来处理文件操作,主要包括文件的打开、关闭、读写等。
2025-03-23 16:05:33
201
原创 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
129
原创 C语言入门教程100讲(36)结构体与函数
结构体可以作为函数参数传递,以便在函数内部访问或修改结构体的成员。结构体参数可以按值传递,也可以按引用传递(通过指针)。按引用传递结构体(通过指针)可以避免复制整个结构体,并允许函数内部修改结构体的成员。按值传递结构体会复制整个结构体,函数内部对结构体的修改不会影响实参。函数可以返回结构体指针,但需要确保返回的指针指向有效的内存地址。函数可以返回结构体,以便将计算结果封装在结构体中返回。
2025-03-23 16:02:01
201
原创 C语言入门教程100讲(34)结构体初始化
结构体初始化是指在声明结构体变量时为其成员赋初值的过程。C 语言提供了多种初始化结构体的方式,包括直接初始化、指定成员初始化和动态初始化。
2025-03-23 15:59:49
99
原创 C语言入门教程100讲(33)结构体定义
结构体是 C 语言中用于组合多个不同类型数据的一种复合数据类型。通过结构体,可以将相关的数据项组织在一起,便于管理和操作。struct 结构体名 {数据类型 成员1;数据类型 成员2;...int age;
2025-03-23 15:58:05
82
原创 C语言入门教程100讲(32)多级指针
多级指针是指指向指针的指针。int *ptr,指向int类型的变量。int **ptr,指向int *类型的指针。int ***ptr,指向int **类型的指针。
2025-03-23 15:56:19
278
原创 C语言入门教程100讲(31)指针与函数
指针可以作为函数参数传递,以便在函数内部修改实参的值。通过指针传递参数,可以实现对实参的直接操作。函数可以返回指针,但需要确保返回的指针指向有效的内存地址。数组作为函数参数时,实际上传递的是数组的首地址。函数指针是指向函数的指针,可以用于动态调用函数。
2025-03-23 15:54:37
61
原创 C语言入门教程100讲(30)指针与数组
在 C 语言中,数组名是一个指向数组首元素的常量指针。因此,指针和数组可以互换使用,通过指针可以访问和操作数组的元素。数组作为函数参数时,实际上传递的是数组的首地址。因此,函数内部可以通过指针访问数组元素。指针算术是指对指针进行加减操作,以访问数组中的其他元素。数组名表示数组的首地址,可以赋值给指针变量。数组名和指针在大多数情况下可以互换使用。指针数组是一个数组,其元素是指针。数组指针是一个指针,指向一个数组。可以通过指针访问数组元素。可以使用指针遍历数组。
2025-03-23 15:53:48
80
原创 C语言入门教程100讲(27)数组与指针
在 C 语言中,数组名表示数组的首地址,因此数组与指针有密切的关系。通过指针可以访问数组的元素,甚至可以遍历数组。数组作为函数参数时,实际上传递的是数组的首地址。因此,函数内部可以通过指针访问数组元素。指针算术是指对指针进行加减操作,以访问数组中的其他元素。数组名和指针在大多数情况下可以互换使用。数组名是一个指向数组首元素的常量指针。指针数组是一个数组,其元素是指针。数组指针是一个指针,指向一个数组。可以通过指针访问数组元素。可以使用指针遍历数组。
2025-03-23 15:51:25
65
原创 C语言入门教程100讲(24)递归
递归是指函数直接或间接调用自身的过程。递归通常用于解决可以分解为相同问题的子问题的情况,例如计算阶乘、斐波那契数列等。
2025-03-23 15:48:52
77
原创 C语言入门教程100讲(23)参数传递
参数传递是指将实参的值传递给函数的形参的过程。按值传递:将实参的值复制给形参。按引用传递:通过指针将实参的地址传递给形参。
2025-03-23 15:47:51
76
原创 C语言入门教程100讲(22)函数调用
函数调用是程序执行过程中,通过函数名和参数列表来执行函数体的过程。函数调用会将控制权转移到被调用的函数,并在函数执行完毕后返回调用点。
2025-03-23 15:46:52
88
原创 C语言入门教程100讲(21)函数声明
函数声明(也称为函数原型)是告诉编译器函数的名称、返回类型和参数列表,但不包含函数体。函数声明通常放在文件的开头或头文件中,以便在函数定义之前调用函数。特性函数声明函数定义语法返回类型 函数名(参数列表);返回类型 函数名(参数列表) { 函数体 }函数体无包含具体实现代码作用告知编译器函数的存在实现函数的具体功能必须一致。函数声明和函数定义的参数列表(包括参数类型和顺序)必须完全一致。
2025-03-23 15:46:03
75
有初学C++ C linux 嵌入式的吗,这里集合,有大量系统学习的博客教程
2021-04-12
TA创建的收藏夹 TA关注的收藏夹
TA关注的人