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

Linux 中的信号处理方式详解

在 Linux 操作系统中,信号(Signal)是一种进程间或内核与进程之间的通信机制,用于通知进程某种异步事件的发生。例如,当用户按下 Ctrl+C 时,系统会向当前前台进程发送 SIGINT 信号。

本文将介绍三种常见的信号处理方式:

1、默认处理动作

2、自定义信号处理函数

3、忽略信号

一、默认处理动作

系统对每个信号都有一个默认处理动作。比如:

SIGTERM:终止进程(默认)

SIGKILL:强制终止进程,不能捕获

SIGCHLD:子进程退出时通知父进程,默认被忽略

示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>int main() {printf("进程PID: %d\n", getpid());while (1) {sleep(1);}return 0;
}

运行后,在另一个终端输入:

kill -SIGTERM <PID>

进程将被终止,因为 SIGTERM 的默认动作是终止进程。

二、自定义信号处理函数(Custom Handler)

可以通过 signal() 或 sigaction() 函数,指定一个函数来处理信号,实现自定义逻辑。

示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>void handler(int signo) {printf("收到SIGINT信号,进行自定义处理!\n");
}int main() {signal(SIGINT, handler);  // 自定义处理SIGINT信号printf("进程PID: %d\n", getpid());while (1) {sleep(1);}return 0;
}

Ctrl+C默认代表SIGINT,而自定义SIGINT后按下 Ctrl+C,不会终止进程,而是打印信息:

收到SIGINT信号,进行自定义处理!

三、忽略信号(Ignore Signal)

可以通过将信号处理函数设置为 SIG_IGN,来忽略某个信号。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>int main() {signal(SIGINT, SIG_IGN);  // 忽略SIGINTprintf("进程PID: %d\n", getpid());while (1) {sleep(1);}return 0;
}

运行后按下 Ctrl+C,进程将无视该信号,不会中断。

四、总结

信号处理方式调用方法特点
默认动作不做处理或设置为 SIG_DFL系统根据信号类型执行默认操作
忽略信号signal(signo, SIG_IGN)信号被丢弃,不作任何处理
自定义处理signal() / sigaction()用户定义回调函数处理信号
http://www.lqws.cn/news/502471.html

相关文章:

  • 【机器学习深度学习】多层神经网络的构成
  • 在仓颉开发语言中使用数据库
  • TCP/UDP协议深度解析(一):UDP特性与TCP确认应答以及重传机制
  • 计算机网络第九章——数据链路层《介质访问控制》
  • C++(面向对象编程——多态)
  • 曼昆《经济学原理》第九版 宏观经济学 第二十六章货币增长与通货膨胀
  • python中学物理实验模拟:摩檫力
  • BI财务分析 – 反映盈利水平利润占比的指标如何分析(下)
  • iwebsec靶场sqli注入(2)
  • [Linux] Linux用户和组管理
  • GoAdmin代码生成器实践
  • 大模型项目实战:业务场景和解决方案
  • TongWeb替换tomcat
  • Linux Sonic Agent 端部署(详细版)(腾讯云)
  • MySQL:深入总结锁机制
  • 系统架构设计的全方位视角:深入解析4+1视图模型及其应用实践
  • prometheus+grafana+MySQL监控
  • 飞算 JavaAI 插件炸场!一小时搭图书管理系统
  • 从拥塞控制算法热交换到内核错误修复
  • Golang Kratos 系列:业务分层的若干思考(一)
  • 从用户到社区Committer:小米工程师隋亮亮的Apache Fory成长之路
  • WPF/Net Core 简单显示PDF
  • Windows WSL安装Emscripten‌/emsdk(失败)
  • Netty内存池核心PoolArena源码解析
  • OSS监控体系搭建:Prometheus+Grafana实时监控流量、错误码、存储量(开源方案替代云监控自定义视图)
  • RAG大模型开发初探 || 动手大模型应用开发
  • 医疗AI数智立体化体系V2.0泛化多模块编程操作手册--架构师版(下)
  • 第一篇Anaconda/Pytorch/Opencv/Yolov5环境搭建
  • 本地部署搜索引擎 Elasticearch 并实现外网访问(Windows 版本)
  • 6.24_JAVA_微服务day07_RabbitMQ高级