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

在 Unix 和类 Unix 操作系统中,信号是一种异步的通知机制,用于通知进程发生了一些特定的事件。

在 Unix 和类 Unix 操作系统中,信号是一种异步的通知机制,用于通知进程发生了一些特定的事件。以下是一些常见的信号及其用途和默认行为的详细介绍:

常见信号及其用途

  1. SIGINT (2)

    • 含义:中断信号(Interrupt Signal)
    • 来源:通常由用户按下 Ctrl+C 产生。
    • 默认行为:终止进程。
    • 用途:用于请求进程立即中断当前操作。
  2. SIGTERM (15)

    • 含义:终止信号(Terminate Signal)
    • 来源:通常由 kill 命令发送。
    • 默认行为:终止进程。
    • 用途:用于请求进程优雅地终止,允许进程执行清理操作。
  3. SIGKILL (9)

    • 含义:强制终止信号(Kill Signal)
    • 来源:通常由 kill -9 命令发送。
    • 默认行为:立即终止进程,不给进程任何机会执行清理操作。
    • 用途:用于强制终止进程,通常在其他信号无效时使用。
  4. SIGHUP (1)

    • 含义:挂断信号(Hangup Signal)
    • 来源:通常由终端会话结束或控制终端关闭产生。
    • 默认行为:终止进程。
    • 用途:用于通知进程其控制终端已关闭,常用于守护进程的重新加载配置文件。
  5. SIGQUIT (3)

    • 含义:退出信号(Quit Signal)
    • 来源:通常由用户按下 Ctrl+\ 产生。
    • 默认行为:终止进程并生成核心转储文件(core dump)。
    • 用途:用于请求进程退出并生成调试信息。
  6. SIGABRT (6)

    • 含义:中止信号(Abort Signal)
    • 来源:通常由 abort() 函数调用产生。
    • 默认行为:终止进程并生成核心转储文件。
    • 用途:用于请求进程中止并生成调试信息。
  7. SIGALRM (14)

    • 含义:定时器信号(Alarm Signal)
    • 来源:通常由 alarm() 函数调用产生。
    • 默认行为:终止进程。
    • 用途:用于在指定时间后发送信号,常用于超时处理。
  8. SIGSTOP (17, 19, 23)

    • 含义:停止信号(Stop Signal)
    • 来源:通常由 Ctrl+Z 产生。
    • 默认行为:暂停进程的执行。
    • 用途:用于暂时停止进程的执行。
  9. SIGCONT (18, 20, 24)

    • 含义:继续信号(Continue Signal)
    • 来源:通常由 fgbg 命令产生。
    • 默认行为:恢复被 SIGSTOP 暂停的进程。
    • 用途:用于恢复被暂停的进程。
  10. SIGCHLD (20, 17, 18)

    • 含义:子进程状态改变信号(Child Process Status Change Signal)
    • 来源:当子进程终止或停止时产生。
    • 默认行为:忽略。
    • 用途:用于通知父进程其子进程的状态变化,常用于进程管理。
  11. SIGUSR1 (30, 10, 16) 和 SIGUSR2 (31, 12, 17)

    • 含义:用户定义信号 1 和 2
    • 来源:由用户或程序自定义。
    • 默认行为:终止进程。
    • 用途:用于应用程序自定义的信号处理,通常用于触发特定的操作或状态变更。
  12. SIGSEGV (11)

    • 含义:段错误信号(Segmentation Fault Signal)
    • 来源:当进程尝试访问无效的内存地址时产生。
    • 默认行为:终止进程并生成核心转储文件。
    • 用途:用于检测和调试内存访问错误。
  13. SIGPIPE (13)

    • 含义:管道破裂信号(Broken Pipe Signal)
    • 来源:当进程试图写入一个已经关闭的管道时产生。
    • 默认行为:终止进程。
    • 用途:用于处理管道通信中的错误。
  14. SIGFPE (8)

    • 含义:浮点异常信号(Floating Point Exception Signal)
    • 来源:当进程执行非法的算术运算(如除以零)时产生。
    • 默认行为:终止进程并生成核心转储文件。
    • 用途:用于检测和调试算术错误。

示例代码

以下是一个简单的 C 程序,展示了如何处理 SIGINTSIGTERM 信号:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>

void handle_sigint(int sig) {
    printf("Received SIGINT signal, cleaning up...\n");
    cleanup();
    exit(0);
}

void handle_sigterm(int sig) {
    printf("Received SIGTERM signal, cleaning up...\n");
    cleanup();
    exit(0);
}

void cleanup() {
    // 清理操作
    printf("Performing cleanup...\n");
}

int main() {
    // 注册信号处理器
    signal(SIGINT, handle_sigint);
    signal(SIGTERM, handle_sigterm);

    // 模拟长时间运行的任务
    while (1) {
        sleep(1);
    }

    return 0;
}

总结

  • SIGINT:中断信号,通常由 Ctrl+C 产生。
  • SIGTERM:终止信号,用于优雅地终止进程。
  • SIGKILL:强制终止信号,立即终止进程。
  • SIGHUP:挂断信号,通常由终端会话结束产生。
  • SIGQUIT:退出信号,通常由 Ctrl+\ 产生。
  • SIGABRT:中止信号,通常由 abort() 产生。
  • SIGALRM:定时器信号,用于超时处理。
  • SIGSTOP:停止信号,暂停进程。
  • SIGCONT:继续信号,恢复被暂停的进程。
  • SIGCHLD:子进程状态改变信号,用于进程管理。
  • SIGUSR1SIGUSR2:用户定义信号,用于自定义操作。
  • SIGSEGV:段错误信号,用于检测内存访问错误。
  • SIGPIPE:管道破裂信号,用于处理管道通信中的错误。
  • SIGFPE:浮点异常信号,用于检测算术错误。

通过理解和使用这些信号,你可以更好地控制和管理进程的行为,特别是在复杂的系统和分布式环境中。


http://www.kler.cn/a/396603.html

相关文章:

  • IROS讲座:如何写出受欢迎的论文
  • 直接映射缓存配置
  • Molecular signatures database (MSigDB) 3.0
  • STM32学习笔记-----UART的概念
  • 深入探索 React Hooks:原理、用法与性能优化全解
  • ubuntu20.04 colmap 安装2024.11最新
  • 【C#】第6章:用户界面设计 课后习题
  • 【提高篇】3.4 GPIO(四,工作模式详解 下)
  • 企业知识中台:构建智慧企业的核心
  • 三、计算机视觉_01图像的基本操作
  • Android 国际化多语言标点符号的适配
  • 基于lighthouse搭建私有网盘Cloudreve【开源应用实践】
  • pySpark乱码
  • 【星闪EBM-H63开发板】AT固件的配置与测试
  • 【Java Web】JSON 以及 JSON 转换
  • JavaWeb笔记整理——Spring Task、WebSocket
  • 【摄像头识别动物行为通常涉及计算机视觉技术】
  • 基于Java+SpringBoot+Vue的智慧社区设计与实现
  • 用枚举算法解决LeetCode第3348题最小可整除数位乘积II
  • 代码随想录算法训练营第三十八天 | 322.零钱兑换 279.完全平方数 139.单词拆分 多重背包以及背包总结
  • 如何使用EasyExcel生成多列表组合填充的复杂Excel示例
  • Dockerfile构建镜像(练习一Apache镜像)(5-1)
  • 蓝桥杯每日真题 - 第10天
  • [Android]相关属性功能的裁剪
  • Linux---常用shell脚本
  • 力扣654:最大二叉树