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

农资网络销售平台搜索优化的培训免费咨询

农资网络销售平台,搜索优化的培训免费咨询,计算机学前端好还是后端好,两学一做网站源码Linux信号处理全解析:从入门到实战 一、初识Linux信号:系统级的"紧急电话" 信号是什么? 信号是Linux系统中进程间通信的"紧急通知",如同现实中的交通信号灯。当用户按下CtrlC(产生SIGINT信号&…

Linux信号处理全解析:从入门到实战

一、初识Linux信号:系统级的"紧急电话"

  1. 信号是什么?
    信号是Linux系统中进程间通信的"紧急通知",如同现实中的交通信号灯。当用户按下Ctrl+C(产生SIGINT信号)时,相当于给程序发送了"立即停车"的指令。

  2. 常见信号速查表(精简版)
    | 信号编号 | 名称 | 触发方式 | 默认行为 |
    |----------|-----------|------------------------|------------------------|
    | 1 | SIGHUP | 终端断开 | 终止进程 |
    | 2 | SIGINT | Ctrl+C | 终止进程 |
    | 9 | SIGKILL | kill -9 | 强制终止 |
    | 15 | SIGTERM | 默认终止信号 | 优雅终止 |
    | 17 | SIGCHLD | 子进程状态改变 | 通知父进程 |

生活案例:SIGTERM(15)如同礼貌的停车请求,SIGKILL(9)则是拖车强制拖走。


二、信号操作入门:从命令行到代码

  1. 终端操作双雄:kill vs killall
优雅终止nginx进程(发送SIGTERM)
$ kill 1234 强制终止所有python进程 
$ killall -9 python 查看信号列表 
$ kill -l 

对比项:

  • kill:精确打击(需知道PID)
  • killall:范围清除(按进程名称)
  1. 编程基础:发送信号的两种姿势
// 发送信号给其他进程 
kill(pid, SIGTERM);// 给自己发送信号 
raise(SIGINT);

实验场景:创建父子进程,通过SIGCHLD实现僵尸进程回收(代码示例见附录A)


三、信号处理进阶:从接收到响应

  1. 信号处理三剑客
// 简单注册(传统方式)
signal(SIGINT, handler);// 高级注册(推荐方式)
struct sigaction sa;
sa.sa_handler = handler;
sigaction(SIGINT, &sa, NULL);

对比实验:

  • 连续快速按Ctrl+C时,signal可能丢失信号,而sigaction能正确捕获
  1. 定时器实战:闹钟与秒表
alarm(5);  // 5秒后触发SIGALRM 
ualarm(500000, 1000000); // 0.5秒后首次触发,之后每1秒触发 // 高精度定时器 
struct itimerval timer = {{2, 500000},  // 每2.5秒重复 {1, 0}        // 首次1秒后触发 
};
setitimer(ITIMER_REAL, &timer, NULL);

应用场景:实现精准心跳检测(误差<1ms)


四、信号控制艺术:精确管理的秘诀

  1. 信号集操作四部曲
sigset_t set;
sigemptyset(&set);          // 初始化空集合 
sigaddset(&set, SIGINT);    // 添加SIGINT 
sigprocmask(SIG_BLOCK, &set, NULL); // 阻塞信号 
sigpending(&set);           // 查看待处理信号 
  1. 信号屏蔽的三种策略
    | 策略 | 效果 | 适用场景 |
    |--------------|--------------------------------|------------------------|
    | 完全阻塞 | 信号永不递送 | 关键代码段保护 |
    | 临时阻塞 | 延迟信号处理 | 事务操作 |
    | 选择性接收 | 通过sigsuspend控制 | 高并发事件处理 |

五、sigsuspend的原子魔法:解决世纪难题

  1. 传统方案的致命缺陷
sigprocmask(SIG_UNBLOCK, &set, NULL); // 解除阻塞 
pause(); // 这里可能永远阻塞!
  1. sigsuspend的原子化操作
sigset_t mask;
sigfillset(&mask);
sigsuspend(&mask); // 原子化:解除阻塞+等待信号 

原理图解:

[初始状态] -> [保存掩码] -> [设置新掩码] -> [等待信号]↑                                  |+--------[恢复原始掩码]←-----------+
  1. 实战案例:安全信号等待器
void handler(int sig) {printf("Received %d\n", sig);
}int main() {struct sigaction sa;sigset_t mask;sigemptyset(&mask);sigaddset(&mask, SIGINT);sigprocmask(SIG_BLOCK, &mask, NULL);sa.sa_handler = handler;sigaction(SIGINT, &sa, NULL);while(1) {printf("Waiting...\n");sigsuspend(&mask); // 安全等待信号 }
}

六、性能优化与避坑指南

  1. 信号处理黄金法则

  2. 精简处理函数:避免调用非异步安全函数

  3. 使用volatile变量:保证标志位的可见性

  4. 优先选择sigaction:确保可靠性和可移植性

  5. 注意信号队列:实时信号(SIGRTMIN+)支持排队

  6. 多线程慎用:每个线程有独立信号掩码

  7. 常见问题解决方案
    | 问题现象 | 解决方案 |
    |------------------------|------------------------------|
    | 僵尸进程堆积 | SIGCHLD+wait组合拳 |
    | 服务无法正常关闭 | 捕获SIGTERM实现优雅退出 |
    | 定时任务执行滞后 | 使用setitimer提高精度 |
    | 信号处理函数被重复调用 | 设置SA_NODEFER标志 |


附录A:僵尸进程回收代码示例

// SIGCHLD处理示例 
void sigchld_handler(int sig) {while(waitpid(-1, NULL, WNOHANG) > 0);
}int main() {struct sigaction sa;sa.sa_handler = sigchld_handler;sigaction(SIGCHLD, &sa, NULL);if(fork() == 0) {// 子进程逻辑 exit(0);}while(1) pause();
}
http://www.dtcms.com/wzjs/456612.html

相关文章:

  • 摄影化妆艺术学校网站源码如何做电商
  • 途牛网站大数据建设网络运营团队
  • 医院网站建设 中企动力长沙疫情最新消息今天封城了
  • 做网站销售是干什么的宿州百度seo排名软件
  • 许昌做网站汉狮网络网站推广优化的方法
  • 外贸关键词网站电脑培训
  • 武汉做网站熊掌号整合营销传播案例分析
  • 化妆品网站做的好的怎么自己注册网站
  • 海城网站建设百度产品大全入口
  • 好的ftp网站网络营销可以做什么工作
  • 网站开发语言在线检测优化关键词的步骤
  • 服饰网站模板设计如何做一个自己的网站呢
  • wordpress统计点击ip杭州优化商务服务公司
  • 石家庄网站快速排名上海抖音推广
  • 云南省网站建设公司网络营销策略优化
  • 网站开发什么技术网络搜索引擎
  • 百家利网站开发软文范例100例
  • 苏州建站公司优搜苏州聚尚网络企业网站优化方案
  • 潜江人才网官网搜索引擎优化seo多少钱
  • 怎样用eclipse做网站腾讯中国联通
  • 网站301重定向代码百度网盘怎么提取别人资源
  • 建设聚美优品网站收流量费吗上海seo排名
  • 卢沟桥做网站的公司南宁seo网络优化公司
  • 衡水网站建设维护日照网络推广公司
  • 手机网站建设制作教程视频百度推广代理商返点
  • 同和网站建设seo产品推广
  • wordpress代码行号快速排名优化怎么样
  • 贵州建设厅网站报名系统中关村在线app
  • wordpress做的外贸网站6百度权重5的网站能卖多少钱
  • 手机端网站开发流程百度推广登录账号首页