Python——signal.signal函数处理OS信号


整体说明

  • signal.signal() 是 Python 中用于设置信号处理方式的核心函数
  • signal.signal()主要用于捕获和处理操作系统发送的各种信号(如中断信号、子进程状态变化信号等)

signal.signal 函数说明

  • 基本语法如下:

    1
    2
    3
    import signal

    signal.signal(signalnum, handler)
  • 参数说明:

    • signalnum:需要处理的信号类型(如 signal.SIGINT 表示键盘中断,signal.SIGCHLD 表示子进程状态变化等)
    • handler:信号处理函数(或特殊常量),用于定义收到信号后的行为

信号类型(signalnum

  • 常见的信号常量包括:
    • signal.SIGINT:程序终止(Interrupt)信号,通常由 Ctrl+C 触发
    • signal.SIGTERM:终止请求,默认可以被捕获和处理
    • signal.SIGCHLD:子进程状态改变(终止、暂停等)时触发
    • signal.SIGKILL:强制终止信号(无法被捕获或忽略
    • signal.SIGSTOP:暂停信号(无法被捕获或忽略
  • 完整信号列表可通过 signal.__dict__ 查看

处理函数(handler

  • handler 可以是以下三种类型之一:

  • 自定义函数类型:

    • 函数需接收两个参数:signum(信号编号)和 frame(当前栈帧对象,可选)
    • 使用示例:
      1
      2
      3
      4
      5
      6
      def handle_sigint(signum, frame):
      print(f"\n收到信号 {signum},程序即将退出")
      exit(0)

      # 注册 SIGINT 信号的处理函数
      signal.signal(signal.SIGINT, handle_sigint)
  • 使用默认处理方式 ,即取值 signal.SIG_DFL

    • 此时表示使用默认处理方式(系统预设行为,如 SIGINT 默认终止程序)
    • 使用示例:
      1
      2
      # 恢复 SIGINT 的默认处理(取消自定义函数)
      signal.signal(signal.SIGINT, signal.SIG_DFL)
  • 使用忽略该信号处理方式 ,即取值 signal.SIG_IGN

    • 表示忽略该信号(不做任何处理)
    • 使用示例:
      1
      2
      # 忽略 SIGINT 信号(Ctrl+C 无效)
      signal.signal(signal.SIGINT, signal.SIG_IGN)

使用注意事项

  • 信号处理函数应尽量简单,避免包含复杂逻辑(如 I/O 操作、长时间阻塞等),否则可能导致程序不稳定
  • 部分信号(如 SIGKILLSIGSTOP)无法被捕获或忽略,用于强制终止/暂停程序
  • 信号处理函数通常在主线程中执行,多线程程序中需谨慎处理信号,避免线程安全问题
  • 部分信号(如 SIGCHLD)在 Windows 系统中可能不支持,使用时需注意平台兼容性