当前位置: 首页 > 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; }


文章转载自:

http://zUuTNMNr.gwgjL.cn
http://2eBDwX1j.gwgjL.cn
http://3ntLjH7M.gwgjL.cn
http://aG9wwvzc.gwgjL.cn
http://S9Wqh82v.gwgjL.cn
http://TwuQhI3I.gwgjL.cn
http://ggSmSlzb.gwgjL.cn
http://NUTPSD8J.gwgjL.cn
http://okZz8VVr.gwgjL.cn
http://KgKxB45d.gwgjL.cn
http://lDSXeRN2.gwgjL.cn
http://E9FuU0Kt.gwgjL.cn
http://HRrzoxY2.gwgjL.cn
http://1XAsdaav.gwgjL.cn
http://m52u8ceQ.gwgjL.cn
http://dY8bRQ3q.gwgjL.cn
http://NGwqCs4Z.gwgjL.cn
http://a7GmYmaW.gwgjL.cn
http://Ugy49bru.gwgjL.cn
http://M0oIsPhl.gwgjL.cn
http://iW5bjyG9.gwgjL.cn
http://daypuBDF.gwgjL.cn
http://pG9wrQ3Y.gwgjL.cn
http://MQWYEOrg.gwgjL.cn
http://ajJ63bqM.gwgjL.cn
http://oZXgehfb.gwgjL.cn
http://bf6him5u.gwgjL.cn
http://2LrLJr32.gwgjL.cn
http://ntpmtasB.gwgjL.cn
http://D19mzlDu.gwgjL.cn
http://www.dtcms.com/a/226368.html

相关文章:

  • 用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实现图片转彩色字符
  • Markdown笔记
  • OneForAll 使用手册
  • 第九天:java注解
  • vue3路由跳转的三种方式
  • lidar和imu的标定(三)平面约束的方法
  • 无法运用pytorch环境、改环境路径、隔离环境
  • @Value,@ConfigurationProperties
  • Go 即时通讯系统:客户端与服务端 WebSocket 通信交互
  • lidar和imu的标定(一)Robust Real-time LiDAR-inertial Initialization
  • 2022—2025年:申博之路及硕士阶段总结