版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux编程面试题及详细答案(实战版)一、Linux系统基础与文件IO1、简述Linux一切皆文件的设计思想,以及普通文件、设备文件、管道文件的区别答案:Linux核心设计理念就是将系统中所有软硬件资源都抽象为文件,统一通过文件读写接口操作,不用为不同设备单独开发适配接口,极大简化了系统调用和程序开发逻辑。三者核心区别:1.普通文件:最常见的文本、二进制、压缩文件等,存储在磁盘中,用于持久化存储数据,支持随机读写、偏移定位。2.设备文件:分为字符设备和块设备,不占用磁盘存储空间,本质是内核设备驱动的入口。字符设备(串口、键盘)按字节流式读写,无缓存;块设备(硬盘、U盘)按数据块读写,带系统缓存。3.管道文件:纯内存临时文件,分为匿名管道和命名管道,用于进程间数据传输,数据单向流动、读完即销毁,不持久化存储,不支持随机读写。2、open、read、write、close属于什么调用?和fopen、fread、fwrite库函数的核心区别答案:open/read/write/close是Linux系统调用,直接陷入内核执行,属于操作系统原生接口。fopen/fread/fwrite是C标准库函数,是对系统调用的二次封装。核心区别:1.缓存机制:库函数自带用户态缓冲区,减少频繁内核态切换,读写效率更高;系统调用无用户态缓存,每次操作都直接交互内核,小数据频繁读写效率低。2.适用场景:日常文件读写优先用库函数;硬件设备、网络通信、精准数据同步、无缓存场景必须用原生系统调用。3.跨平台性:库函数跨平台通用;系统调用仅适配Linux/Unix系统,Windows无法使用。4.文件标识:系统调用用文件描述符(int整数);库函数用FILE结构体指针。3、什么是文件描述符?进程默认打开的3个文件描述符是什么答案:文件描述符是内核为进程分配的非负整数索引,用于唯一标识进程打开的文件、设备、管道、套接字等资源。进程维护一张文件描述符表,通过该数值快速定位内核对应的文件结构体。进程启动默认自动打开三个文件描述符:0:标准输入(stdin),默认关联键盘输入1:标准输出(stdout),默认关联终端屏幕输出2:标准错误(stderr),默认关联终端错误输出,无缓冲区,错误信息实时打印二、进程管理1、进程和线程的核心区别,什么时候用多进程、什么时候用多线程答案:核心区别:1.资源隔离:进程是系统资源分配的最小单位,每个进程拥有独立的虚拟地址空间、堆、文件描述符,进程间完全隔离;线程是调度执行的最小单位,同一进程内的所有线程共享地址空间、堆、全局变量、文件资源,仅私有栈和寄存器。2.开销成本:创建、销毁进程需要复制页表、资源句柄,开销大、速度慢;线程共享进程资源,创建销毁开销极小。3.通信方式:进程间通信复杂,依赖管道、消息队列、共享内存、socket等;线程间直接读写全局变量、堆内存即可通信,只需处理同步互斥。4.容错性:一个进程崩溃不影响其他进程;一个线程崩溃会导致整个进程退出,所有线程终止。使用场景:多进程:任务独立性强、需要高容错、资源隔离要求高,比如服务器独立业务模块、避免单进程崩溃全局挂掉的场景。多线程:任务频繁创建销毁、任务间数据交互多、追求低开销高并发,比如接口请求处理、数据解析、IO阻塞等待场景。2、fork函数原理,fork之后父子进程的执行顺序、资源拷贝规则答案:fork()用于创建子进程,调用一次返回两次:父进程返回子进程PID,子进程返回0,返回负数代表创建失败。1.资源拷贝规则(写时复制COW)现代Linux不直接完整复制父进程内存,初始时父子进程共享同一份物理内存,只读数据共用;当任意一方修改内存数据时,内核才会为修改方单独复制一份内存副本,既保证资源独立,又大幅提升fork效率。2.执行顺序无固定顺序,由系统调度器决定,可能父先执行,也可能子先执行,代码中不能依赖固定执行顺序,需要手动同步控制。3.继承资源子进程继承父进程的文件描述符、信号处理方式、工作目录、用户权限;独有PID、进程状态、栈、寄存器、未决信号。3、僵尸进程、孤儿进程是什么?如何处理僵尸进程答案:1.孤儿进程:父进程先于子进程退出,子进程被init进程(PID=1)收养,资源会被正常回收,无危害。2.僵尸进程:子进程执行完毕退出,释放了绝大部分资源,但进程退出状态信息未被父进程读取,进程PCB仍保留在系统中,占用PID资源。大量僵尸进程会耗尽系统PID,导致无法创建新进程。处理方式:1.父进程主动调用wait()/waitpid(),主动回收子进程退出状态,彻底释放资源;2.父进程注册SIGCHLD信号处理函数,子进程退出会发送该信号,在信号函数中统一回收子进程;3.父进程创建子进程后直接退出,让init进程自动收养回收子进程(临时方案)。三、信号处理1、Linux常见信号有哪些?SIGINT、SIGKILL、SIGCHLD、SIGSEGV作用答案:1.SIGINT(2号):终端中断信号,对应键盘Ctrl+C,用于终止前台进程,可被捕获、忽略、自定义处理。2.SIGKILL(9号):强制杀死进程信号,无法被捕获、忽略、阻塞,用于强制终止卡死、无响应进程,是最彻底的进程终止方式。3.SIGCHLD(17号):子进程退出信号,子进程结束后自动发送给父进程,核心用于父进程异步回收子进程,避免僵尸进程。4.SIGSEGV(11号):段错误信号,进程访问非法内存导致,比如野指针、数组越界、访问只读内存、释放已回收内存。2、信号的捕获、阻塞、忽略的区别答案:1.忽略:进程接收信号后直接丢弃,不做任何处理,信号直接失效。但SIGKILL、SIGSTOP无法被忽略。2.捕获:进程注册自定义信号处理函数,收到信号后不执行系统默认动作,转而执行自定义业务逻辑,常用于优雅退出、资源清理、回收子进程。3.阻塞:进程暂时屏蔽信号,信号到来后不会丢失,会被放入未决信号队列。待解除阻塞后,信号再触发对应处理逻辑。适合临界区代码执行场景,避免信号打断核心业务。四、多线程与同步互斥1、什么是线程安全?导致线程不安全的核心原因答案:线程安全指多线程同时执行同一段代码、访问同一共享资源时,程序运行结果和单线程执行结果一致,不会出现数据错乱、逻辑异常。不安全核心原因:1.存在共享可变资源(全局变量、堆内存数据);2.读写操作非原子性,一条代码编译后对应多条汇编指令,线程切换会打断执行过程;3.CPU指令重排、寄存器缓存导致多线程数据可见性问题。2、互斥锁、条件变量、读写锁的区别及适用场景答案:1.互斥锁(mutex)特性:同一时刻仅一个线程持有锁,读写操作都互斥,简单高效。场景:读写频率均衡、简单共享资源保护,是最常用的同步方式。2.条件变量(cond)特性:必须配合互斥锁使用,用于线程等待/唤醒,解决“忙等”问题,节省CPU资源。场景:生产者消费者模型、线程等待某个条件满足后再执行。3.读写锁(rwlock)特性:读与读共享,写与读、写与写互斥,读多写少时效率远高于互斥锁。场景:配置数据、缓存数据等读多写少的业务场景。3、死锁产生的四个必要条件,如何避免死锁答案:四个必要条件(必须同时满足才会产生死锁):1.互斥:资源同一时刻仅能被一个线程占用;2.占有且等待:线程持有已有锁,同时等待获取新锁;3.不可剥夺:已持有的锁不能被其他线程强制抢占;4.循环等待:多个线程形成锁的循环等待链路。避免方案:1.统一锁的获取顺序,杜绝循环等待;2.尽量减少嵌套加锁,能不加锁就不加锁;3.使用带超时的锁获取接口,超时后主动释放已有资源;4.精简锁粒度,只在核心临界区加锁。五、Linux网络编程基础1、TCP和UDP的核心区别,各自适用场景答案:1.可靠性:TCP面向连接,有确认、重传、校验、有序重组机制,数据不丢失、不乱序;UDP无连接,无校验重传,可能丢包、乱序。2.效率开销:TCP头部开销大,握手、挥手、拥塞控制逻辑复杂,传输效率偏低;UDP头部极简,无额外控制逻辑,传输速度快、延迟低。3.拥塞控制:TCP自带拥塞控制,网络拥堵时自动降速,不会压垮网络;UDP无拥塞控制,发包过快容易导致网络拥塞丢包。适用场景:TCP:文件传输、网页访问、登录通信、支付数据等要求数据绝对可靠的场景。UDP:视频直播、语音通话、游戏对局、实时弹幕等追求低延迟,允许少量丢包的场景。2、TCP三次握手、四次挥手的过程,为什么不能两次握手答案:三次握手(建立连接):1.客户端发送SYN报文,请求建立连接;2.服务端收到SYN,回复SYN+ACK,确认客户端请求,同时向客户端发起连接请求;3.客户端收到报文,回复ACK,服务端收到后连接正式建立。四次挥手(断开连接):1.主动关闭方发送FIN,告知对方不再发送数据;2.被动关闭方回复ACK,确认关闭请求,此时被动方仍可发送剩余数据;3.被动方数据发送完毕后,发送FIN报文,请求关闭反向连接;4.主动关闭方回复ACK,双方连接彻底断开。为什么不能两次握手:两次握手只能保证客户端发送、服务端接收正常,无法保证客户端能正常接收服务端的报文。会导致服务端单方面建立连接、占用资源,而客户端无连接记录,造成资源浪费。三次握手可以双向验证收发能力,确保连接可靠。3、IO多路复用select、poll、epoll的区别,epoll高效的原因答案:核心区别:1.select:最大文件描述符数量有限(默认1024),每次调用都需要重新拷贝fd集合、遍历所有fd,效率低,仅适用于少量连接场景。2.poll:突破1024最大fd限制,原理和select一致,仍需要遍历全部fd,高并发下性能依旧较差。3.epoll:Linux专属高性能多路复用模型,无fd数量限制,基于事件通知机制,无需遍历所有文件描述符。epoll高效核心原因:1.内核维护就绪链表,仅返回有读写事件的fd,无需全量遍历;2.采用内存映射(mmap)减少数据拷贝开销;3.支持边缘触发(ET),仅在状态变化时通知,减少无效回调,适合超高并发场景。六、Linux调试与性能优化1、常见的Linux调试工具及用途(gdb、top、netstat、strace)答案:1.gdb:代码调试工具,支持断点调试、单步执行、查看变量、查看调用栈、分析段错误、core文件解析,定位程序崩溃、逻辑异常问题。2.top:系统进程监控工具,实时查看CPU、内存占用、进程状态、负载情况,快速定位耗资源进程。3.netstat/ss:网络状态查看工具,查看端口监听、TCP/UDP连接数、连接状态、端口占用,排查端口冲突、连接泄露问题。4.strace:系统调用跟踪工具,打印程序运行过程中所有系统调用、参数、返回值,无需改代码即可排查卡死、文件打开失败、权限异常等问题。2、什么是内存泄漏?如何排查Linux程序内存泄漏答案:内存泄漏是程序动态申请堆内存后,使用完毕未主动释放,且程序失去该内存的指针,导致内存无法复用,长期运行后内存占用持续升高,最终耗尽系统内存。排查方式:1.通过top观察进程RES内存,持续稳步上涨无回落,基本判定存在内存泄漏;2.使用valgrind工具检测,精准定位未释放的内存代码行、泄漏大小;3.查看程序内存申请逻辑,重点检查分支场景、异常退出场景是否遗漏内存释放。七、高频手写简答真题1、简述Linux进程内存布局答案:进程虚拟地址空间从低到高依次为:1.代码段(text):存放编译后的二进制指令,只读;2.数据段(data):存放已初始化全局变量、静态变量;3.BSS段:存放未初始化全局、静态变量,程序启动时自动清零;4.堆(heap):动态内存区域,由malloc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 34886-2026无损检测复合材料激光错位散斑检测方法
- GB/T 13159-2026数字微波通信系统进网技术要求
- 烷基苯装置操作工岗位理论考核试卷含答案
- 生活垃圾焚烧操作工岗位操作安全考核试卷含答案
- 物流服务师基础操作考核试卷含答案
- 铸管精整操作工岗位实操能力考核试卷含答案
- 2025年职业技能大赛裁判员培训试题
- 2025年质量月质量知识竞赛试题集及答案(共60题)
- 2025年中国邮政集团工作人员招聘考试笔试试题(含答案)
- 2025年中级消控员题库及答案(可下载)
- 制度壁垒经济效应-洞察与解读
- 2025广东茂名市茂南区面向驻茂部队随军家属招聘1人备考题库及答案详解(考点梳理)
- 设备日常维护保养培训课件
- 造林树种选择
- 义鼠课件教学课件
- GB/T 21873-2025橡胶密封件给、排水管及污水管道用接口密封圈材料规范
- 雨课堂学堂在线学堂云《临床伦理与科研道德(山东大学)》单元测试考核答案
- nvivo-课件教学课件
- 2025中远海运重工招聘笔试历年参考题库(含答案详解)
- 转体桥施工技术培训
- 雨课堂学堂云在线《高级医学英语(首都医大 )》单元测试考核答案
评论
0/150
提交评论