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

Linux进程信号的捕捉处理方式

在Linux系统中,进程信号的捕捉和处理是进程管理的重要组成部分。信号是操作系统用来通知进程发生了某种事件的一种机制。以下是Linux进程信号捕捉和处理的几种常见方式:

信号处理函数

进程可以通过设置信号处理函数来捕捉和处理信号。信号处理函数是一个用户定义的函数,当信号发生时,操作系统会调用该函数。使用signalsigaction系统调用可以设置信号处理函数。

#include <signal.h>
#include <stdio.h>
#include <unistd.h>void handle_signal(int signum) {printf("Received signal %d\n", signum);
}int main() {signal(SIGINT, handle_signal);while (1) {printf("Waiting for signal...\n");sleep(1);}return 0;
}

忽略信号

进程可以选择忽略某些信号,使其不产生任何效果。使用signal系统调用并将处理函数设置为SIG_IGN可以忽略信号。

#include <signal.h>
#include <stdio.h>
#include <unistd.h>int main() {signal(SIGINT, SIG_IGN);while (1) {printf("Ignoring SIGINT...\n");sleep(1);}return 0;
}

默认处理

如果进程没有为信号设置处理函数,信号将按照默认行为处理。默认行为可能是终止进程、忽略信号或产生核心转储文件。使用signal系统调用并将处理函数设置为SIG_DFL可以恢复信号的默认行为。

#include <signal.h>
#include <stdio.h>
#include <unistd.h>int main() {signal(SIGINT, SIG_DFL);while (1) {printf("Default handling of SIGINT...\n");sleep(1);}return 0;
}

阻塞信号

进程可以暂时阻塞某些信号,使其在解除阻塞之前不会被处理。使用sigprocmask系统调用可以阻塞或解除阻塞信号。

#include <signal.h>
#include <stdio.h>
#include <unistd.h>int main() {sigset_t set;sigemptyset(&set);sigaddset(&set, SIGINT);sigprocmask(SIG_BLOCK, &set, NULL);printf("SIGINT is blocked. Try sending SIGINT...\n");sleep(5);sigprocmask(SIG_UNBLOCK, &set, NULL);printf("SIGINT is unblocked.\n");while (1) {printf("Waiting for signal...\n");sleep(1);}return 0;
}

信号队列

Linux支持实时信号,这些信号可以被排队处理。使用sigqueue系统调用可以发送带有附加数据的信号。

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>void handle_signal(int signum, siginfo_t *info, void *context) {printf("Received signal %d with value %d\n", signum, info->si_value.sival_int);
}int main() {struct sigaction sa;sa.sa_sigaction = handle_signal;sa.sa_flags = SA_SIGINFO;sigaction(SIGRTMIN, &sa, NULL);union sigval value;value.sival_int = 123;sigqueue(getpid(), SIGRTMIN, value);while (1) {sleep(1);}return 0;
}

通过以上方式,Linux进程可以灵活地捕捉和处理信号,以适应不同的应用场景。

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

相关文章:

  • 【Java学习】枚举(匿名类详解)
  • 基于大模型的新型隐球菌脑膜炎智能诊疗全流程系统设计与实现的技术方案文档
  • CD37.【C++ Dev】string类的模拟实现(上)
  • fastmcp: 更好用的 MCP Python 框架
  • SlideLoss与FocalLoss在YOLOv8分类损失中的应用及性能分析
  • 指针运算典型例题解析
  • IOC和Bean
  • 【读书笔记】《编码:隐匿在计算机软硬件背后的语言》01 逻辑与开关
  • Android方法耗时监控插件开发
  • Java 基础面试题
  • 自定义类型-结构体(一)
  • 【Rust】枚举和模式匹配
  • 2025年数维杯赛题C题专家 组委会C题专家疑集锦
  • 5.8线性动态规划2
  • SpringMVC-执行流程
  • 40、C# 数组、链表、哈希、队列、栈数据结构的特点、优点和缺点
  • AI:生成对抗网络(GAN)
  • 【Vue】vuex的getters mapState mapGetters mapMutations mapActions的使用
  • yocto的大致工作流程
  • CSS渲染性能优化
  • MySQL进阶篇2_SQL优化、锁
  • 探索 JWT(JSON Web Token):原理、结构与实践应用对比
  • RK3568-OpenHarmony(1) : OpenHarmony 5.1的编译
  • C# 使用 WinUI 3 项目模板创建桌面应用程序
  • 在 Kubernetes 中使用 Docker 实现 GPU 支持的完整方案
  • Ubuntu 与 Windows 双系统环境下 NTFS 分区挂载教程
  • 添加物体.
  • 2025年5月15日前 免费考试了! Oracle AI 矢量搜索专业​​认证
  • 用jsp简单实现C语言标准化测试系统
  • (2025)图文解锁RAG从原理到实操