
嵌入式/Linux C/C++软件工程师知识体系(包括面试)
文章平均质量分 80
面向Linux C/C++软件工程师,内容涵盖面试、笔试常见问题,以及实际工作问题,致力于打造Linux开发知识库
优惠券已抵扣
余额抵扣
还需支付
¥49.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
奇妙之二进制
csdn博客专家,C/C++领域优质创作者,抖音搜奇妙之二进制,专注于Linux C/C++、嵌入式Linux开发,偶尔谈谈人生,目前致力于完成大约500篇的linux C/C++开发知识体系库,所有的文章都会一直保持更新(优化内容、排版),想学习的可以订阅我的专栏,也可以关注Linux 世界。
展开
-
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 · 33229 阅读 · 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 · 2261 阅读 · 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 · 11760 阅读 · 3 评论 -
Linux C/C++ or 嵌入式面试之《C/C++笔面试系列》(10) C++ 前置后置增减运算符重载形式与比较
C语言的++、–运算符在此不讨论。文章目录1、前置后置增减运算符重载的形式2、前置和后置运算符的性能比较1、前置后置增减运算符重载的形式自增运算符“++”和自减运算符“–”分别包含两个版本。即运算符前置形式(如 ++x)和运算符后置形式(如 x++),这两者进行的操作是不一样的。因此,当我们在对这两个运算符进行重载时,就必须区分前置和后置形式。C++根据参数的个数来区分前置和后置形式。如果按照通常的方法来重载 ++ 运算符(即作为成员函数重载时不带参数,或者作为非成员函数重载时带有一个参数),那么重载原创 2020-09-01 19:13:14 · 5536 阅读 · 3 评论 -
C语言入门教程100讲(0)从了解C语言的发展史开始
C语言从诞生至今已经有了超过五十年的历史,它不仅影响了编程语言的发展,还对操作系统、计算机架构以及软件工程产生了深远的影响。无论是对于程序员还是计算机科学研究者,C语言都是一门必须掌握的语言,它的简洁、灵活和高效使其在许多领域中依然保持着强大的生命力。原创 2025-03-29 19:33:52 · 126 阅读 · 0 评论 -
C语言入门教程100讲(40)文件定位
文件定位是指在文件中移动文件指针的位置,以便从指定位置开始读写文件。C 语言提供了fseekftell和rewind等函数来实现文件定位。原创 2025-03-24 23:24:31 · 221 阅读 · 0 评论 -
C语言入门教程100讲(39)文件读写
函数可以从文件中读取一行字符串。函数可以向文件中写入一行字符串。函数可以从文件中格式化读取数据。函数可以向文件中格式化写入数据。函数可以从文件中读取二进制数据。函数可以向文件中写入二进制数据。函数可以从文件中读取一个字符。函数可以向文件中写入一个字符。原创 2025-03-23 22:40:47 · 141 阅读 · 0 评论 -
C语言入门教程100讲(38)文件打开与关闭
文件操作是指通过程序对文件进行读写、创建、删除等操作。C 语言提供了标准库函数来处理文件操作,主要包括文件的打开、关闭、读写等。原创 2025-03-23 16:05:33 · 193 阅读 · 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 · 116 阅读 · 0 评论 -
C语言入门教程100讲(36)结构体与函数
结构体可以作为函数参数传递,以便在函数内部访问或修改结构体的成员。结构体参数可以按值传递,也可以按引用传递(通过指针)。按引用传递结构体(通过指针)可以避免复制整个结构体,并允许函数内部修改结构体的成员。按值传递结构体会复制整个结构体,函数内部对结构体的修改不会影响实参。函数可以返回结构体指针,但需要确保返回的指针指向有效的内存地址。函数可以返回结构体,以便将计算结果封装在结构体中返回。原创 2025-03-23 16:02:01 · 195 阅读 · 0 评论 -
C语言入门教程100讲(35)结构体与指针
结构体指针是指向结构体变量的指针。通过结构体指针,可以访问和操作结构体的成员。原创 2025-03-23 16:00:43 · 384 阅读 · 0 评论 -
C语言入门教程100讲(34)结构体初始化
结构体初始化是指在声明结构体变量时为其成员赋初值的过程。C 语言提供了多种初始化结构体的方式,包括直接初始化、指定成员初始化和动态初始化。原创 2025-03-23 15:59:49 · 76 阅读 · 0 评论 -
C语言入门教程100讲(33)结构体定义
结构体是 C 语言中用于组合多个不同类型数据的一种复合数据类型。通过结构体,可以将相关的数据项组织在一起,便于管理和操作。struct 结构体名 {数据类型 成员1;数据类型 成员2;...int age;原创 2025-03-23 15:58:05 · 72 阅读 · 0 评论 -
C语言入门教程100讲(32)多级指针
多级指针是指指向指针的指针。int *ptr,指向int类型的变量。int **ptr,指向int *类型的指针。int ***ptr,指向int **类型的指针。原创 2025-03-23 15:56:19 · 272 阅读 · 0 评论 -
C语言入门教程100讲(31)指针与函数
指针可以作为函数参数传递,以便在函数内部修改实参的值。通过指针传递参数,可以实现对实参的直接操作。函数可以返回指针,但需要确保返回的指针指向有效的内存地址。数组作为函数参数时,实际上传递的是数组的首地址。函数指针是指向函数的指针,可以用于动态调用函数。原创 2025-03-23 15:54:37 · 56 阅读 · 0 评论 -
C语言入门教程100讲(30)指针与数组
在 C 语言中,数组名是一个指向数组首元素的常量指针。因此,指针和数组可以互换使用,通过指针可以访问和操作数组的元素。数组作为函数参数时,实际上传递的是数组的首地址。因此,函数内部可以通过指针访问数组元素。指针算术是指对指针进行加减操作,以访问数组中的其他元素。数组名表示数组的首地址,可以赋值给指针变量。数组名和指针在大多数情况下可以互换使用。指针数组是一个数组,其元素是指针。数组指针是一个指针,指向一个数组。可以通过指针访问数组元素。可以使用指针遍历数组。原创 2025-03-23 15:53:48 · 71 阅读 · 0 评论 -
C语言入门教程100讲(29)指针运算
指针运算是指对指针进行加减操作,以访问相邻的内存地址。指针运算通常用于遍历数组或动态内存操作。原创 2025-03-23 15:53:04 · 48 阅读 · 0 评论 -
C语言入门教程100讲(28)指针基础
指针是 C 语言中用于存储内存地址的变量。通过指针,可以直接访问和操作内存中的数据。原创 2025-03-23 15:52:10 · 75 阅读 · 0 评论 -
C语言入门教程100讲(27)数组与指针
在 C 语言中,数组名表示数组的首地址,因此数组与指针有密切的关系。通过指针可以访问数组的元素,甚至可以遍历数组。数组作为函数参数时,实际上传递的是数组的首地址。因此,函数内部可以通过指针访问数组元素。指针算术是指对指针进行加减操作,以访问数组中的其他元素。数组名和指针在大多数情况下可以互换使用。数组名是一个指向数组首元素的常量指针。指针数组是一个数组,其元素是指针。数组指针是一个指针,指向一个数组。可以通过指针访问数组元素。可以使用指针遍历数组。原创 2025-03-23 15:51:25 · 58 阅读 · 0 评论 -
C语言入门教程100讲(26)多维数组
多维数组是数组的数组,可以理解为表格或矩阵。C 语言支持多维数组,最常见的是二维数组。原创 2025-03-23 15:50:37 · 106 阅读 · 0 评论 -
C语言入门教程100讲(25)一维数组
一维数组是 C 语言中用于存储相同类型数据的线性数据结构。数组中的每个元素通过索引访问,索引从 0 开始。原创 2025-03-23 15:49:42 · 83 阅读 · 0 评论 -
C语言入门教程100讲(24)递归
递归是指函数直接或间接调用自身的过程。递归通常用于解决可以分解为相同问题的子问题的情况,例如计算阶乘、斐波那契数列等。原创 2025-03-23 15:48:52 · 67 阅读 · 0 评论 -
C语言入门教程100讲(23)参数传递
参数传递是指将实参的值传递给函数的形参的过程。按值传递:将实参的值复制给形参。按引用传递:通过指针将实参的地址传递给形参。原创 2025-03-23 15:47:51 · 68 阅读 · 0 评论 -
C语言入门教程100讲(22)函数调用
函数调用是程序执行过程中,通过函数名和参数列表来执行函数体的过程。函数调用会将控制权转移到被调用的函数,并在函数执行完毕后返回调用点。原创 2025-03-23 15:46:52 · 78 阅读 · 0 评论 -
C语言入门教程100讲(21)函数声明
函数声明(也称为函数原型)是告诉编译器函数的名称、返回类型和参数列表,但不包含函数体。函数声明通常放在文件的开头或头文件中,以便在函数定义之前调用函数。特性函数声明函数定义语法返回类型 函数名(参数列表);返回类型 函数名(参数列表) { 函数体 }函数体无包含具体实现代码作用告知编译器函数的存在实现函数的具体功能必须一致。函数声明和函数定义的参数列表(包括参数类型和顺序)必须完全一致。原创 2025-03-23 15:46:03 · 68 阅读 · 0 评论 -
C语言入门教程100讲(19)do-while 循环
do-while循环是 C 语言中的一种循环控制语句,与while循环类似,但do-while循环会先执行循环体,然后再检查条件。do-whiledo {// 循环体} while (条件);循环体:至少执行一次,即使条件一开始就为假。条件:每次循环结束后检查的条件,如果为真则继续循环。原创 2025-03-23 15:44:40 · 109 阅读 · 0 评论 -
C语言入门教程100讲(20)函数定义
函数是 C 语言中用于封装代码的基本单元。通过函数,可以将一段代码逻辑独立出来,便于复用和维护。函数名:函数的唯一标识符。参数列表:函数接收的输入。返回类型:函数返回的结果类型。函数体:函数的具体实现代码。返回类型 函数名(参数列表) {// 函数体return 返回值;// 如果返回类型不是 void不可以。C 语言不支持在函数内部定义另一个函数。原创 2025-03-23 14:22:36 · 265 阅读 · 0 评论 -
C语言入门教程100讲(1)从Hello World开始编程之旅
Hello World” 是编程界最经典的程序,通常用于初学者学习一门新语言时编写的第一个程序。它的功能非常简单:在屏幕上输出 “Hello, World!” 这句话。原创 2025-03-22 21:42:56 · 105 阅读 · 0 评论 -
Linux开发者的CI/CD(11)jenkins变量
pipeline {agent anystages {steps {script {steps {script {在script步骤内部,你可以像在普通 Groovy 脚本中一样定义和使用变量(如这些变量在各自的script块中是局部的,仅在该块内有效。原创 2024-11-25 23:09:48 · 548 阅读 · 0 评论 -
编译链接实战(23)交叉编译之./configure --build,--host,--target设置
host:编译出来的二进制程序所执行的主机,因为绝大多数是本机编译,本机执行,所以这个值就等于build。说明:我们利用mipsel-linux的编译器对binutils进行编译,编译出来的binutils运行在mipsel-linux,这个binutils用来编译能够在mipsel-linux运行的代码。说明:我们利用mipsel-linux的编译器对binutils进行编译,编译出来的binutils运行在i386-linux,这个binutils用来编译能够在mipsel-linux运行的代码。原创 2024-11-23 16:01:10 · 335 阅读 · 0 评论 -
C++编程法则365天一天一条(303)异步编程之std::promise和std::future
头文件,用于实现异步操作中的值传递和异常传递。一起使用,提供了一种机制,使得一个线程可以将。是 C++11 引入的一个模板类,位于。调用后,再次尝试设置会导致。原创 2024-11-03 16:47:13 · 134 阅读 · 0 评论 -
C++编程法则365天一天一条(344)理解std::optional的设计初衷
的设计初衷是为了解决处理可选值时的安全性和清晰性问题,提供一种简洁、易用的方式来表示和管理可能不存在的值。通过引入,C++ 提供了一个更现代化的替代方案,减少了使用传统空指针和特定标记值所带来的复杂性和错误风险。原创 2024-11-02 14:41:43 · 180 阅读 · 0 评论 -
C++编程法则365天一天一条(12)再谈static_cast之不能使用的场景
可以用于在整数和浮点类型之间进行转换,但在某些情况下,可能导致数据丢失或精度问题。例如,将一个大浮点数转换为整数,可能会丢失精度。不能用于复杂的类型转换,如数组到指针的转换、函数指针的转换等。对于这些情况,应使用其他类型转换,如。不能用于将两个不相关的类型进行转换。是 C++ 中用于类型转换的一个关键字,它在许多情况下都非常有用,但也有一些场景是不能使用。对于需要从常量指针转换为非常量指针的情况,应使用。在使用多态时,如果不确定对象的真实类型,应该使用。,它会在运行时检查类型,并在转换失败时返回。原创 2024-11-02 13:42:00 · 114 阅读 · 0 评论 -
Linux C/C++并发编程实战(9)x86 上的原子操作实现--lock 指令前缀
当指令执行完毕,这个锁定动作也就会消失。在单处理器系统( UniProcessor,简称 UP)中,能够在单条指令中完成的操作都可以认为是原子操作,因为中断只能发生在指令与指令之间。在多处理器系统( Symmetric Multi-Processor,简称 SMP)中情况有所不同,由于系统中有多个处理器在独立的运行,即使在能单条指令中完成的操作也可能受到干扰。(以及所有以 ‘X’ 开头的指令)都能够保证在多处理器系统下的原子操作,它们总会宣告一个 “LOCK#” 信号,而不管有没有 LOCK 前缀。原创 2024-09-22 21:58:31 · 438 阅读 · 0 评论 -
Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(22) 互斥锁实现原理
futex是fast userspace mutex的缩写,翻译过来就是快速用户空间互斥锁,是内核提供的同步机制,可以用于实现互斥锁、读写锁、条件变量等。锁本质上就是一个计算变量,或者说一块存放变量的内存。当置1时表示上锁,置0表示解锁。futex便是一个32位的整型变量,只不过这个变量的地址由用户指定,也就是futex调用的第一个参数,需要用户传入变量地址。为了在进程间共享 futex,它通常放在使用 mmap 或 shmat 创建的共享内存区域中。原创 2024-09-22 19:00:34 · 626 阅读 · 0 评论 -
网络编程实战(19)正向代理和反向代理
在计算机网络领域,代理服务器扮演着至关重要的角色,它在服务器与客户端之间充当中间人的角色,有效地提高系统的安全性、性能和可扩展性。其中正向代理和反向代理是两种最为常见的代理方式。本文将详细介绍这两种代理方式的概念、特点、使用场景以及用途,帮助读者更好地理解它们在网络架构中的作用。正向代理和反向代理在计算机网络中各自发挥着重要的作用。正向代理主要关注客户端的访问需求和安全性,而反向代理则更注重后端服务器的负载均衡、安全性和性能优化。原创 2024-08-28 11:26:26 · 285 阅读 · 0 评论 -
网络编程实战(17)一文读懂VPN以及OpenVPN实现原理
ISP(Internet Service Provider,互联网服务提供商)是提供互联网接入服务的公司或组织。ISP 通过各种技术(如光纤、DSL、卫星或无线)将互联网连接到家庭或企业。由于国内的一些原因,有时候我们访问Google、youtobe等国外网站,需要通过一些代理软件才能访问,俗称科学上网。原创 2024-08-23 09:01:13 · 482 阅读 · 0 评论 -
Linux C/C++并发编程实战(11)缓存颠簸
当一个处理器写入数据时,缓存一致性协议需要确保其他处理器的缓存中的数据也被更新或使其失效。例如,如果一个处理器在处理器 A 的缓存中更新了数据,那么协议会将这个更新传播到其他处理器的缓存。缓存一致性协议:为了保证在多个处理器缓存中数据的一致性,系统使用缓存一致性协议(如 MESI)。每当一个处理器写入数据时,协议必须将这个更新通知到所有其他处理器,以确保它们的缓存中的数据是一致的。每个处理器的缓存都可能有该数据的副本。当一个处理器对这个数据进行写入(如增加计数器的值)时,这个数据在处理器的缓存中被更新。原创 2024-08-15 18:19:01 · 306 阅读 · 0 评论 -
linux防火墙iptables用法
在早期的 Linux 系统中,默认使用的是iptables配置防火墙。尽管新型 的firewalld防火墙已经被投入使用多年,但是大量的企业在生产环境中依然出于各种原因而继续使用 iptables。考虑到 iptables 在当前生产环境中还具有顽强的生命力,我觉得还是有必要再好好地讲解一下这项技术。iptables 是 Linux 防火墙工作在用户空间的管理工具,是IP 信息包过滤系统是一部分,用来设置、维护和检查 Linux 内核的 IP 数据包过滤规则。filterinputoutput和。原创 2024-08-12 17:23:18 · 228 阅读 · 0 评论 -
《网络编程实战系列》(17)网络桥接模式
桥接模式通过将多个网络接口连接在一起,形成一个逻辑上统一的网络,为网络设备之间的通信提供了一种简洁而有效的解决方案。它广泛应用于网络扩展、虚拟化环境、无线网络等场景中。尽管桥接模式具有透明性和兼容性,但在大型网络或复杂环境中,需要谨慎配置,以避免潜在的广播风暴和安全问题。原创 2024-08-10 23:10:12 · 360 阅读 · 0 评论