版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LinuxC高频面试题及详细答案(实战版)一、C语言基础面试题1、static关键字的作用?答案:static主要有三个核心作用,分场景使用:1)修饰局部变量:改变变量生命周期,程序运行期间内存不释放,只会初始化一次,上次调用的值会保留到下次调用。作用域不变,依旧只能在当前函数内使用。2)修饰全局变量:改变变量作用域,仅限当前源文件(.c)内部可见,其他文件无法通过extern引用,避免全局变量跨文件冲突。3)修饰函数:函数仅当前源文件可调用,对外隐藏接口,适合封装模块内部私有函数。面试加分点:static变量存储在数据段(.data),而非栈区,所以不会随函数栈销毁而丢失数据。2、const关键字的作用,以及const*、*const、const*const区别?答案:const用来修饰只读数据,防止数据被误修改,提升代码安全性,同时方便编译器优化。1)constint*p:指针指向的值不可改,指针变量本身可以改。即不能*p=100,但可以p=NULL。2)int*constp:指针变量本身不可改,指向的值可以改。即不能p=NULL,但可以*p=100。3)constint*constp:指针本身和指向的值都不可修改,完全只读。3、指针和数组的区别?数组名本质是什么?答案:核心区别:1)数组是连续内存空间,属于自定义数据类型,编译时确定大小;指针是存储地址的变量,占用4/8字节内存。2)数组名不能自增、自减(arr++非法),指针可以移动(p++合法)。3)sizeof(数组名)得到数组总字节数,sizeof(指针)得到指针本身大小。数组名本质:绝大多数场景下,数组名是数组首元素的地址常量;仅有两个例外:sizeof(数组名)、&数组名,此时代表整个数组。4、结构体字节对齐原则?为什么需要内存对齐?答案:对齐原则:1)结构体每个成员的偏移地址,必须是自身大小的整数倍;2)结构体整体大小,必须是内部最大基本成员大小的整数倍;3)可通过#pragmapack(n)手动指定对齐字节数。对齐原因:硬件CPU访问内存时,默认按固定字节块读取,未对齐内存需要两次读取、拼接数据,效率极低;对齐后单次读取即可,大幅提升访问效率,同时部分硬件不支持非对齐内存访问。二、Linux内存管理面试题1、Linux进程内存布局详解?答案:一个完整Linux进程虚拟内存,从低地址到高地址依次为:1)代码段(.text):存放编译后的二进制指令,只读、共享,程序运行期间固定不变。2)只读数据段(.rodata):存放const修饰的全局变量、字符串常量,只读不可写。3)初始化数据段(.data):存放已初始化的全局变量、static静态变量。4)未初始化数据段(.bss):存放未初始化的全局、静态变量,程序加载时自动清零,不占用磁盘文件空间。5)堆(heap):动态内存区,由malloc/free管理,地址向上增长,进程手动申请释放。6)栈(stack):存放局部变量、函数参数、返回地址,地址向下增长,系统自动分配释放,空间有限。7)内核空间:最高地址,所有进程共享,用户态无法直接访问。2、malloc、free原理?堆和栈的核心区别?答案:malloc/free原理:malloc并非直接向内核申请内存,而是通过glibc维护堆内存池。首次申请内存时,通过brk/mmap系统调用向内核获取大块内存,后续小额申请直接从内存池分配,减少系统调用开销。malloc分配的内存会预留头部信息,记录内存大小、空闲块链表等,free依靠头部信息回收内存,并入空闲链表,不会立即归还内核。堆栈区别:1)管理方式:栈由系统自动管理,堆由程序员手动申请释放;2)空间大小:栈空间固定(默认8M),堆空间极大,受限于系统虚拟内存;3)增长方向:栈向下增长,堆向上增长;4)生命周期:栈内存随函数调用结束销毁,堆内存需手动free,否则会内存泄漏。3、内存泄漏的原因、危害及排查方式?答案:泄漏原因:动态申请的堆内存,使用结束后未free,或内存指针被覆盖、丢失,导致内存无法回收。危害:进程占用内存持续升高,系统可用内存减少,引发卡顿、OOM杀进程、程序崩溃等问题,长期运行的后台服务问题最严重。排查工具:valgrind(开发阶段精准检测)、top/ps查看内存占用、jemalloc内存统计、gdb断点排查。三、Linux进程与线程面试题1、进程和线程的区别?各自优缺点?答案:核心区别:1)资源隔离:进程是资源分配最小单位,独享虚拟内存、文件描述符;线程是调度最小单位,共享进程所有资源。2)开销:进程创建、销毁、切换开销极大,需要复制页表、资源;线程开销极小,仅创建栈和TCB。3)通信方式:进程通信复杂(管道、socket、共享内存等);线程直接读写全局变量即可通信。4)安全性:进程相互独立,一个进程崩溃不影响其他进程;一个线程崩溃,整个进程直接退出。适用场景:高并发轻量任务用多线程,高隔离、高稳定任务用多进程。2、fork函数原理?子进程继承哪些资源?哪些不继承?答案:fork()用于创建子进程,调用一次返回两次:父进程返回子进程PID,子进程返回0,出错返回-1。继承内容:代码段、数据段、堆、栈、文件描述符、信号处理方式、工作目录、用户权限。不继承内容:进程PID、父进程PID、进程运行时间、文件锁、未处理的信号。写时复制(COW):Linux不会直接复制父进程内存,父子进程共享同一块物理内存,只有任意一方修改数据时,才会单独复制一份内存,大幅提升fork效率。3、僵尸进程、孤儿进程是什么?如何处理僵尸进程?答案:孤儿进程:父进程先退出,子进程被init进程(PID=1)收养,无害,会正常回收资源。僵尸进程:子进程退出,父进程未调用wait/waitpid读取子进程退出状态,子进程PCB资源无法释放,残留系统中,占用PID资源,大量僵尸进程会导致系统无法创建新进程。处理方式:1)父进程主动调用wait()/waitpid()回收子进程;2)父进程注册SIGCHLD信号回调,子进程退出触发信号,批量回收;3)父进程退出,所有僵尸子进程被init进程自动回收。4、线程同步方式有哪些?各自优缺点?答案:常用四种同步方式:互斥锁、读写锁、条件变量、信号量。1)互斥锁(mutex):同一时间仅一个线程访问临界资源,简单高效,适合读写场景均等的场景。缺点:无法区分读写,读操作也会互斥,并发度低。2)读写锁(rwlock):读共享、写独占,多读少写场景性能极高,适合配置读取、日志查询场景。3)条件变量(cond):配合互斥锁使用,用于线程等待/唤醒,避免轮询浪费CPU,适合生产者消费者模型。4)信号量(semaphore):可控制多个线程同时访问资源,支持进程间同步,灵活性高。缺点:使用复杂,容易死锁。四、Linux文件与IO面试题1、文件描述符是什么?0、1、2分别代表什么?答案:文件描述符是进程打开文件的索引整数,是内核维护的文件结构体数组下标,用户态通过fd操作文件、管道、socket。默认三个标准文件描述符:0:标准输入stdin1:标准输出stdout2:标准错误stderr注意:进程新建文件描述符,会优先使用当前最小的空闲fd。2、阻塞IO和非阻塞IO的区别?答案:1)阻塞IO:内核数据未就绪时,进程挂起休眠,不占用CPU,等待数据就绪后返回。优点:节省CPU资源;缺点:单个线程只能处理一个IO,并发差。2)非阻塞IO:数据未就绪时,系统调用立即返回错误,进程不阻塞,可轮询查询状态。优点:可循环处理多个IO;缺点:轮询空转,极度浪费CPU。3、select、poll、epoll区别?(IO多路复用核心考点)答案:三者都是IO多路复用技术,单线程监听多个文件描述符,解决阻塞IO并发低的问题。select缺点:最大fd数量有限(1024),每次调用需要重置监听集合,内核和用户态频繁拷贝数据,遍历所有fd检测就绪状态,效率低。poll优化:解除1024数量限制,采用链表存储fd,无需重置监听集合;但依旧需要遍历所有fd,高并发下性能依旧瓶颈。epoll优势(Linux独有):1)基于事件驱动,仅返回就绪的fd,无需遍历全部;2)内存映射,减少用户态与内核态数据拷贝;3)无最大fd限制,支持百万级高并发;4)支持LT(水平触发)和ET(边缘触发)模式,ET模式效率更高。总结:低并发用select/poll,高并发服务器必须用epoll。五、Linux网络编程面试题1、TCP和UDP区别?各自适用场景?答案:TCP(传输控制协议):面向连接、可靠、有序、拥塞控制、重传机制。优点:数据不丢失、不乱序、稳定;缺点:头部开销大、传输速度慢、资源占用高。适用场景:文件传输、网页访问、登录通信等对可靠性要求高的场景。UDP(用户数据报协议):无连接、不可靠、无重传、无拥塞控制。优点:开销小、传输快、实时性强;缺点:可能丢包、乱序。适用场景:直播、视频通话、游戏、DNS解析等对实时性要求高于可靠性的场景。2、TCP三次握手、四次挥手原理?为什么三次握手?为什么四次挥手?答案:三次握手(建立连接):1)客户端发送SYN报文,请求建立连接;2)服务端收到SYN,回复SYN+ACK,确认客户端请求,并向客户端发起连接请求;3)客户端收到SYN+ACK,回复ACK,连接正式建立。为什么不是两次:两次握手无法确认服务端发送能力是否正常,会导致服务端维护无效连接,浪费资源。三次握手可双向校验收发能力正常。四次挥手(断开连接):1)主动方发送FIN,告知对方不再发送数据;2)被动方回复ACK,确认关闭读通道,主动方只能收不能发;3)被动方数据处理完毕,发送FIN,告知主动方不再发送数据;4)主动方回复ACK,双方连接彻底断开。为什么四次:TCP读写通道独立,关闭写通道后,被动方可能还有残留数据需要处理,无法直接关闭连接,必须分两步挥手。答案:核心作用:1)保证被动方收到最后一次ACK报文,避免被动方重发FIN;2)等待网络中残留的过期报文彻底消失,避免新连接收到旧连接的脏数据。六、Linux系统运维与调试面试题1、段错误(Segmentfault)常见原因?答案:段错误本质是访问了非法内存地址,常见场景:1)访问空指针、野指针指向的内存;2)修改只读内存(如修改字符串常量);3)数组越界访问栈内存;4)栈溢出(局部变量过大、递归死循环);5)释放已释放的堆内存、使用悬空指针。2、gdb常用调试命令有哪些?答案:编译必须加-g参数保留调试信息,常用命令:1)list(l):查看代码;2)break(b)行号/函数名:打断点;3)run(r):启动程序;4)next(n):单步跳过,不进入函数;5)step(s):单步进入,进入函数内部;6)print(p):打印变量、地址值;7)bt:查看函数调用栈(排查段错误核心命令);8)quit(q):退出调试。3、常用Linux开发排查命令?答案:1)进程排查:ps、top、kill、pstack;2)网络排查:netstat、ss、ping、tcpdump;3)文件排查:ls、du、df、stat;4)日志排查:cat、tail-f、grep;5)内存排查:free、vmstat、valgrind。七、编程易错面试题1、野指针是什么?如何避免野指针?答案:野指针是指向未知非法内存的指针,无固定地址,操作系统未分配给进程,访问会触发段错误。产生原因:指针
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025消防安全知识培训考试试题附答案
- 2025医疗机构管理条例人员试题及答案
- 2025中医治未病试题及答案
- 2026年《医疗器械经营监督管理办法》培训知识题库附含参考答案
- 2026年人工智能伦理与数据隐私保护知识考察试题及答案解析
- 骨坏死的症状有哪些
- AI深度解读-标准模板
- 胃病预防漫画手册
- 高速安全小贴士讲解
- 人工智能行业岗位需求
- 美容解剖学课件
- 自考英语二0015历年真题及答案(2025-2026)六年来完整收
- 尿动力学检查患者的护理
- QGDW1512-2014电力电缆及通道运维规程
- 家庭教育中的数字媒体素养教育实践
- T/HPBA 1-2021预制混凝土外墙接缝密封防水技术标准
- DB31/T 1236-2020未成年人司法社会工作服务规范
- 人教版八年级物理上册全册知识要点复习提纲
- 饲料生产许可证考试(判断题200题)附有答案
- (高清版)JTG 3363-2019 公路桥涵地基与基础设计规范
- 小学语文作文:五感法描写课件
评论
0/150
提交评论