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

linux信号详解

一、信号本质

信号是进程间异步事件通知机制,通过软中断实现。当内核检测到事件(如硬件异常、终端输入、软件条件)时,会向目标进程递送信号12。


二、前台/后台进程信号差异

特性前台进程后台进程
信号接收可接收终端信号(Ctrl+C/Z)需通过kill命令发送信号
控制终端独占输入输出输出重定向到日志文件
示例./server./server &

三、信号产生机制

(一)信号处理函数
  1. signal()函数
    头文件:#include <signal.h>
    原型:void (*signal(int sig, void (*func)(int)))(int);
    返回值:成功返回旧处理函数指针,失败返回SIG_ERR48

  2. sigaction()函数
    结构体定义:

(二)软件条件产生信号
函数作用域信号类型典型用例
kill()跨进程任意信号kill(pid, SIGTERM)
raise()当前进程任意信号raise(SIGUSR1)
abort()当前进程SIGABRT触发核心转储
alarm()定时器SIGALRMalarm(10) 10秒后触发

四、信号保存与阻塞

  1. 内核数据结构

    task_struct { sigset_t blocked; // 阻塞信号集 sigset_t pending; // 未决信号集 struct sigaction[]; // 处理函数数组 }

  2. 信号集操作函数组

    sigset_t set; sigemptyset(&set); // 初始化空集 sigaddset(&set, SIGINT); // 添加信号 sigprocmask(SIG_BLOCK, &set, NULL); // 设置屏蔽


五、信号捕捉流程

  1. 进程执行系统调用进入内核态
  2. 内核检查未决信号并处理
  3. 执行用户注册的处理函数
  4. 通过sigreturn系统调用恢复上下文5354

    // 典型处理函数模板 void handler(int sig) { // 仅使用异步安全函数 char msg[] = "Signal received\n"; write(STDERR_FILENO, msg, sizeof(msg)); _exit(1); // 直接退出避免非可重入问题 }


六、中断与执行态

中断类型触发源处理流程
硬件中断CPU异常/外设保存现场→调用中断服务例程
软件中断系统调用(int 0x80)切换内核态执行服务
信号处理内核信号队列用户态与内核态多次切换

七、可重入函数规范

安全实践‌:

  1. 仅使用局部变量
  2. 不调用malloc/free等非可重入函数
  3. 使用volatile修饰共享标志位3738
     

    volatile sig_atomic_t shutdown_flag; void handler(int sig) { shutdown_flag = 1; }

相关文章:

  • 用Python实现一个简单的远程桌面服务端和客户端
  • LCA(最近公共祖先)与树上差分
  • debian12.9或ubuntu,vagrant离线安装插件vagrant-libvirt,20250601
  • Java流【全】
  • 【计网】第六章(网络层)习题测试
  • Cesium快速入门到精通系列教程三:添加物体与3D建筑物
  • linux系统中防火墙的操作
  • 进阶日记(一)大模型的本地部署与运行
  • vue3常用组件有哪些
  • BFS入门刷题
  • STM32——CAN总线
  • 飞牛fnNAS存储空间模式详解
  • P4549 【模板】裴蜀定理
  • Linux --进程状态
  • 利用多进程定时播放,关闭音乐播放器
  • 2025 年 AI 技能的全景解析
  • Hilbert曲线
  • XCPC 常用技巧
  • 中国风展示工作总结商务通用PPT模版
  • Python实例题:Python3实现图片转彩色字符
  • 河南省建设部网站/百度app安装免费下载
  • 兰州做网站维护的公司/成都sem优化
  • 四川省成都市疫情动态/魔贝课凡seo课程好吗
  • 中山手机网站制作哪家好/中国制造网网站类型
  • 工作室网站备案/seo内容优化
  • asp网站做搜索/在线seo优化