在 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 信号:

c 复制代码
#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:浮点异常信号,用于检测算术错误。

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

相关推荐
hhhalloWelt1 小时前
头歌-本关任务:使用GmSSL命令行,生成SM2私钥并对文件进行签名验证(第二关)。
linux·运维·服务器
vortex52 小时前
Linux 下敏感文件路径总结
linux·运维·服务器
阿拉伯梳子2 小时前
无线网络信号 6G、5G和2.4G 的一些小科普
运维·服务器
爱上口袋的天空2 小时前
04 - Clickhouse-21.7.3.14-2单机版安装
linux·服务器·clickhouse
Shall#2 小时前
Unix进程
linux·笔记·unix
x_ SpiderMan3 小时前
nfs服务器
运维·服务器
艾443 小时前
nfs服务器--RHCE
运维·服务器
ling-453 小时前
Javaweb-day12(登录认证)
服务器·前端·servlet
Parrot 安全小子3 小时前
shell编程--永久环境变量和字符串显位
linux·运维·服务器