当前位置: 首页 > web >正文

C++面试题:Linux系统信号详解

在C++面试中,理解Linux信号机制是考察系统编程能力的关键点之一。

信号(Signal)是Linux中进程间通信的异步通知机制,用于处理突发事件(如中断、异常或强制终止)。

以下是Linux系统常见信号的分类、含义及典型应用场景,基于最新POSIX标准和常见实现整理。信号分为普通信号​(编号1-31)和实时信号​(32-64),本文重点介绍31个普通信号。


一、信号核心概念

  • 信号本质​:软中断,由内核、用户或其他进程发送,通知目标进程状态变化(如终端断开、内存错误等)
  • 处理方式​:
    • 默认动作​:终止进程(Term)、生成核心转储(Core)、忽略(Ignore)、停止(Stop)或继续(Continue)
    • 自定义处理​:通过signal()sigaction()注册处理函数,但SIGKILLSIGSTOP不可被捕获、阻塞或忽略
  • 查看命令​:终端执行 kill -l 可列出所有信号

二、常见Linux信号列表(精选15个关键信号)

以下是面试中最常涉及的信号,包括编号、名称、触发原因及默认动作:

编号信号名称触发原因默认动作
1SIGHUP终端挂断(如SSH断开)、守护进程重载配置(如Nginx刷新)终止进程
2SIGINT用户输入Ctrl+C中断前台进程终止进程
3SIGQUIT用户输入Ctrl+\退出进程终止并生成core
4SIGILL执行非法指令(如CPU不支持的指令)终止并生成core
6SIGABRT调用abort()函数或断言失败终止并生成core
8SIGFPE算术错误(如除零、浮点溢出)终止并生成core
9SIGKILLkill -9强制终止进程(不可捕获)立即终止
11SIGSEGV非法内存访问(如空指针解引用、缓冲区溢出)终止并生成core
13SIGPIPE向无读端的管道写入数据(如网络连接断开后继续写)终止进程
14SIGALRM定时器到期(由alarm()setitimer()设置)终止进程
15SIGTERM默认终止信号(kill命令不加参数时发送),允许进程清理资源终止进程
17SIGCHLD子进程终止或停止时通知父进程忽略
18SIGCONT恢复被暂停的进程(如fg命令)继续执行
19SIGSTOP暂停进程(不可捕获,Ctrl+Z触发SIGTSTP停止进程
20SIGTSTP终端暂停信号(Ctrl+Z停止进程

​:

  • 生成core文件​:用于调试,记录进程崩溃时的内存状态(需系统配置允许)
  • 不可靠信号​:编号1-31的信号可能丢失(如连续发送时),而实时信号(32+)支持排队

三、信号在C++中的处理

在C++系统编程中,需掌握信号处理函数:

  1. 注册信号处理​:
#include <csignal>
void handler(int sig) { /* 自定义逻辑 */ }
signal(SIGINT, handler);  // 捕获SIGINT
  1. 发送信号​:
    • 终端:kill -<信号编号> <PID>
    • 代码:kill(<PID>, SIGTERM) 或 raise(SIGABRT)(向自身发送)
  2. 注意事项​:
    • 信号处理函数应避免复杂操作​(如调用非异步安全函数),否则可能引发重入问题。
    • 多线程中信号处理需谨慎,建议使用pthread_sigmask屏蔽信号

四、面试常见问题扩展

  1. SIGKILL vs SIGTERM
    • SIGTERM允许进程优雅退出(可自定义清理);SIGKILL强制终止(内核直接回收资源)
  2. 信号屏蔽​:
    • 使用sigprocmask阻塞信号(如防止SIGINT中断关键代码),sigpending检查未决信号
  3. 实际应用场景​:
    • 服务器:SIGHUP重载配置,SIGCHLD回收子进程资源。
    • 调试:SIGSEGV定位内存错误,SIGTRAP(5)配合断点调试


【C语言】零基础到项目实战

【C语言/C++】零基础到项目实战

初学者营地:1021486511

http://www.xdnf.cn/news/10192.html

相关文章:

  • Postgre数据库分区生产实战
  • Obsidian 社区插件下载修复
  • 随笔20250530 C# 整合 IC卡读写技术解析与实现
  • LangChain表达式(LCEL)实操案例1
  • C++智能指针介绍和区别(std::unique_ptr、std::shared_ptr 和 std::weak_ptr)
  • 004时装购物系统技术解析:构建智能时尚消费平台
  • PRECICE 工具介绍与使用示例
  • 7.atlas安装
  • 5.30 打卡
  • 【计算机网络】fork()+exec()创建新进程(僵尸进程及孤儿进程)
  • Day40
  • RFID赋能零件智能夹取新生态
  • 深度学习全面掌握指南
  • CMP401GSZ-REEL混合电压接口中的23ns延迟与±6V输入范围设计实现
  • 【Zephyr 系列 2】用 Zephyr 玩转 Arduino UNO / MEGA,实现串口通信与 CLI 命令交互
  • Vue 项目命名规范指南
  • 操作系统原理第9章 磁盘存储器管理 重点内容
  • JAVA:抽象类和接口
  • AI书签管理工具开发全记录(五):后端服务搭建与API实现
  • OSG编译wasm尝试
  • PostgreSQL部署
  • PyCharm接入DeepSeek,实现高效AI编程
  • Python中函数知识详解和示例
  • 正则化-深度学习
  • 2011肠衣问题
  • 视频压制(Video Encoding/Compression)
  • 20250530-C#知识:String与StringBuilder
  • dify账号与基础模型配置
  • RK3568项目(四)--uboot启动流程之启动模式选择
  • PPIO × AstrBot:多平台接入聊天机器人,开启高效协同 | 教程