在 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:浮点异常信号,用于检测算术错误。

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

相关推荐
木子Linux4 分钟前
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
linux·运维·服务器·centos·云计算
不惑_22 分钟前
小白入门 · 腾讯云轻量服务器部署 Hadoop 3.3.6
服务器·hadoop·腾讯云
阿甘知识库41 分钟前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
zhou周大哥3 小时前
linux 安装 ffmpeg 视频转换
linux·运维·服务器
loong_XL3 小时前
服务器ip:port服务用nginx 域名代理
服务器·tcp/ip·nginx
夕泠爱吃糖3 小时前
C++中如何实现序列化和反序列化?
服务器·数据库·c++
the丶only4 小时前
单点登录平台Casdoor搭建与使用,集成gitlab同步创建删除账号
linux·运维·服务器·docker·gitlab
书生-w4 小时前
Docker部署GitLab服务器
服务器·docker·gitlab
Ling_suu4 小时前
SpringBoot3——Web开发
java·服务器·前端
alden_ygq4 小时前
etcd网关
服务器·数据库·etcd