当前位置:首页>Linux>嵌入式面试刷题(三) | Linux系统编程相关问题整理

嵌入式面试刷题(三) | Linux系统编程相关问题整理

  • 2026-10-07 06:11:57
嵌入式面试刷题(三) | Linux系统编程相关问题整理

八股文是一种特殊文体,每篇文章包括破题、承题、起讲、入手、起股、中股、后股、束股八个部分,要求严格对仗,字数有限定,题目出自《四书》。 而现在大家常用八股文来指代面试中常见的一些知识、问题。日常工作中我们往往围绕业务逻辑进行开发而忽略这些看似简单却可能不能立马给出精确回答的八股问题上。所以如果你有找工作/换工作的计划,请拿出点时间看看八股,唤醒一下记忆深处的那段代码。

1. Linux中的文件描述符是什么?

文件描述符(fd) 是Linux中访问文件/设备/socket的整数索引。

  • 每个进程有一张  文件描述符表,fd是表中的索引
  • 默认预分配:0=stdin、1=stdout、2=stderr
  • open()  返回最小可用fd

使用限制:

  • 进程级限制:ulimit -n  查看,默认通常1024
  • 系统级限制:/proc/sys/fs/file-max,内核总共能打开的文件数
  • 可通过 setrlimit() 或修改 /etc/security/limits.conf 调整

2. Linux中进程是什么?进程的基本属性?

Linux中 进程是资源分配的基本单位。

基本属性:

  • PID:唯一标识进程
  • PPID:父进程ID
  • 进程状态:运行R、睡眠S/D、停止T、僵尸Z
  • 虚拟地址空间:代码段、数据段、堆、栈、共享库映射
  • 文件描述符表:打开的文件/socket
  • 信号处理表
  • 用户ID/组ID:权限控制

每个进程有独立的  页表(虚拟地址空间隔离)

3. Linux进程间通信机制有哪些?

Linux进程间通信(IPC)机制:

  • 管道(Pipe):半双工,父子进程间通信,pipe()  创建
  • 命名管道(FIFO):有文件系统路径名,无亲缘关系进程也能用
  • 消息队列:按消息为单位收发,支持优先级
  • 共享内存:最快的IPC,直接映射同一块物理内存
  • 信号量:进程间同步/互斥
  • 信号(Signal):异步通知机制(如SIGKILL、SIGTERM)
  • Socket:支持不同主机间通信,最灵活

4. 什么是/proc文件系统?常用的proc接口有哪些?

/proc文件系统是Linux内核信息的虚拟文件接口。不占磁盘空间,文件内容由内核动态生成.

常用接口:

  • /proc/PID/status:进程状态信息
  • /proc/PID/maps:进程内存映射
  • /proc/PID/fd/:进程打开的文件描述符
  • /proc/meminfo:系统内存信息
  • /proc/cpuinfo:CPU信息
  • /proc/interrupts:中断统计
  • /proc/sys/:可读写的内核参数(如  net.core.somaxconn)

/proc是Linux系统管理和调试的核心工具,很多命令(如top、ps)底层都读取/proc。

5. 信号量和共享内存有什么区别?

信号量和共享内存解决不同问题:

信号量:用于同步和互斥

  • 控制多个进程对共享资源的访问顺序
  • 本身不传递数据,只是一个计数器
  • P操作(减)/ V操作(加)

共享内存:用于数据共享

  • 多个进程映射同一块物理内存,直接读写
  • 速度最快(无需内核拷贝)
  • 不提供同步机制,需要配合信号量使用

6. 硬链接和软链接的区别是什么?

硬链接:

  • 和原文件共享同一个  inode,是同一份数据的另一个名字
  • 删除原文件不影响硬链接(只要引用计数>0数据还在)
  • 不能跨文件系统,不能链接目录

软链接(符号链接):

  • 一个独立文件,内容是  目标文件的路径
  • 类似Windows快捷方式
  • 可以跨文件系统,可以链接目录
  • 原文件删除后软链接 失效

用 ln file hard_link 创建硬链接,ln -s file soft_link 创建软链接。

7. 如何实现跨平台的条件编译?

  • 预定义宏  判断平台:

    • __linux__:Linux
    • _WIN32:Windows
    • __APPLE__:macOS
    • __arm__、__aarch64__:ARM架构
  • GCC内置宏:__GNUC__、__SIZEOF_POINTER__(指针大小判断32/64位)

  • CMake条件编译:

    • if(CMAKE_SYSTEM_NAME STREQUAL "Linux")  设置不同编译选项
    • target_compile_definitions(myapp PRIVATE MY_PLATFORM_LINUX)

8. Linux中如何获取系统时间?

  • time():秒级精度,返回自1970年以来的秒数

  • gettimeofday():微秒精度,返回  struct timeval

  • clock_gettime():纳秒精度,推荐使用

    • clock_gettime(CLOCK_REALTIME, &ts):系统实时时钟
    • clock_gettime(CLOCK_MONOTONIC, &ts):单调递增时钟
    • struct timespec  包含秒和纳秒

9. Linux中的ELF文件格式的基本结构?

ELF(Executable and Linkable Format) 是Linux的可执行文件格式。

ELF基本结构:

  • ELF Header:魔数、架构、入口点地址、段表/节表偏移
  • Program Header Table:描述段(Segment)信息,加载器使用
  • Section Header Table:描述节(Section)信息,链接器使用
  • 常见节:.text(代码)、.data(已初始化数据)、.bss(未初始化)、.rodata(常量)

ELF类型:

  • ET_EXEC:可执行文件
  • ET_DYN:共享库
  • ET_REL:可重定位文件(.o)

10. Linux中的GDB调试常用命令和技巧有哪些?

常用命令:

  • 启动:gdb ./program,run  执行
  • 断点:break main、break file.c:42、break func if x>10(条件断点)
  • 执行控制:next(单步过)、step(单步入)、continue、finish(执行到函数返回)
  • 查看变量:print var、print *ptr、print arr[0]@10(数组)
  • 内存查看:x/16xb addr(16个字节十六进制显示)
  • 栈信息:backtrace(调用栈)、frame N(切换栈帧)
  • 观察点:watch var(变量被修改时暂停)
  • 多线程:info threads、thread N

最新文章

随机文章