• linux 信号


    信号的定义

    计算机科学中,信号是Unix、类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式。它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。

    信号的作用
    1. 进程间通信:进程可以通过向其他进程发送信号的方式进行通信,例如某个进程在完成了某项工作之后,可以向另一个进程发送 SIGUSR1 信号,通知其进行下一步的操作。
    2. 处理异常:信号可以被用来处理程序中的异常情况,例如当一个进程尝试访问未分配的内存或者除以 0 时,系统会向该进程发送 SIGSEGV 或 SIGFPE 信号,用于处理这些异常情况。
    3. 系统调试:信号可以用于程序的调试,例如在程序运行时,可以向该进程发送 SIGUSR2 信号,用于打印程序的状态信息等。
     信号的分类和编号

    在 Linux 中,信号被分类为标准信号实时信号,每个信号都有一个唯一的编号。标准信号是最基本的信号类型,由整数编号表示,编号范围是 1 到 31。实时信号是 Linux 中的扩展信号类型,由整数编号表示,编号范围是 32 到 64。

    下面是常见的信号编号和对应的信号名称:

    1. 信号编号 信号名称 描述
    2. 1 SIGHUP 控制终端挂起或者断开连接
    3. 2 SIGINT 中断信号,通常由 Ctrl+C 发送
    4. 3 SIGQUIT 退出信号,通常由 Ctrl+\ 发送
    5. 4 SIGILL 非法指令信号
    6. 5 SIGTRAP 跟踪异常信号
    7. 6 SIGABRT 中止信号
    8. 7 SIGBUS 总线错误信号
    9. 8 SIGFPE 浮点错误信号
    10. 9 SIGKILL 强制退出信号
    11. 10 SIGUSR1 用户定义信号1
    12. 11 SIGSEGV 段错误信号
    13. 12 SIGUSR2 用户定义信号2
    14. 13 SIGPIPE 管道破裂信号
    15. 14 SIGALRM 闹钟信号
    16. 15 SIGTERM 终止信号
    17. 16 SIGSTKFLT 协处理器栈错误信号
    18. 17 SIGCHLD 子进程状态改变信号
    19. 18 SIGCONT 继续执行信号
    20. 19 SIGSTOP 暂停进程信号
    21. 20 SIGTSTP 终端停止信号
    22. 21 SIGTTIN 后台进程尝试读取终端输入信号
    23. 22 SIGTTOU 后台进程尝试写入终端输出信号
    24. 23 SIGURG 套接字上的紧急数据可读信号
    25. 24 SIGXCPU 超时信号
    26. 25 SIGXFSZ 文件大小限制超出信号
    27. 26 SIGVTALRM 虚拟定时器信号
    28. 27 SIGPROF 分析器定时器信号
    29. 28 SIGWINCH 窗口大小变化信号
    30. 29 SIGIO 文件描述符上就绪信号
    31. 30 SIGPWR 电源失效信号
    32. 31 SIGSYS 非法系统调用信号
    33. 32 SIGRTMIN 实时信号最小编号
    34. ... ... ...
    35. 64 SIGRTMAX 实时信号最大编号

    kill -l可以查看操作系统拥有的信号

    信号的产生

    1. kill 命令

    kill 命令是 Linux 中最常用的发送信号的命令,语法如下:

    kill [-signal] PID

    其中,-signal 可选参数表示要发送的信号类型,如果省略该参数,则默认发送 SIGTERM 信号。PID 表示接收信号的进程 ID。kill -9 就是指 发送SIGKILL命令。

    2. kill 函数

    除了使用 kill 命令,程序中也可以通过 kill 函数来发送信号。kill 函数的原型如下:

    int kill(pid_t pid, int sig);

    其中,pid 表示接收信号的进程 ID,sig 表示要发送的信号类型。如果函数调用成功,则返回 0,否则返回 -1 并设置 errno。

    3.raise 函数

    raise 函数是一个简单的发送信号的函数,可以用来向当前进程发送信号。raise 函数的原型如下:

    int raise(int sig);

    其中,sig 表示要发送的信号类型。如果函数调用成功,则返回 0,否则返回 -1 并设置 errno。

    4. pthread_kill 函数

    如果在多线程程序中需要向另一个线程发送信号,可以使用 pthread_kill 函数。pthread_kill 函数的原型如下:

    int pthread_kill(pthread_t thread, int sig);

    其中,thread 表示接收信号的线程 ID,sig 表示要发送的信号类型。如果函数调用成功,则返回 0,否则返回错误码。
     

    参考:

    https://blog.csdn.net/qq_45358642/article/details/129758736

    https://baike.baidu.com/item/%E4%BF%A1%E5%8F%B7/7927794

  • 相关阅读:
    阿里云混合云管理平台多Region架构
    朋友圈如何设置定时发送?
    lombok
    【Modbus通讯】记粤西某电厂DCS通讯调试(基础篇)
    这可能是最全的Web测试各个测试点,有这一篇就够了
    备战蓝桥杯---动态规划的一些思想2
    基于B/S版java语言+SpringBoot技术开发的云HIS系统源码 HIS系统住院业务模块常见问题及解决方案
    领探是什么
    jvm zgc使用的染色指针为什么比写屏障效率高,两者都是修改引用的时候触发
    Flink SQL -- 命令行的使用
  • 原文地址:https://blog.csdn.net/weixin_41654661/article/details/134384290