Linux信号基本概念

信号分为两大类:

  • 标准信号,用于内核向进程通知事件,信号范围为1~31
  • 实时信号

信号产生后,会在稍后被传递给某进程,进程也会采取某措施来响应信号。在产生和到达期间,信号处于pending(等待)状态

有时需要确保一段代码不被传递来的信号所中断,这时可以把信号添加到进程的信号掩码中,阻塞该组信号的到达。如果所产生的信号属于阻塞之列,那么信号将保持pending状态,直到后面对其解除阻塞(从信号掩码中移除)。进程可使用各种系统调用对其信号掩码添加和移除信号。

根据信号的不同,进程可以对信号执行的默认操作:

  • 忽略信号:内核将信号丢弃,信号对进程没有产生任何影响(进程都不知道曾出现过该信号)
  • 终止进程:进程异常终止,不是因调用exit()而发生的正常终止
  • 产生coredump文件,同时终止进程
  • 暂停进程
  • 恢复进程:暂停之后恢复执行

除了采取默认行为之外,进程也能改变信号的响应行为,将此称为对信号的disposition(处置),程序可以将对信号的disposition设置为:

  • 采取默认行为
  • 忽略信号:适用于默认行为为终止进程的信号
  • 执行信号处理器程序:用户自定义

通知内核应当去调用某处理器程序的行为,通常称之为安装信号处理器程序,调用信号处理器程序以响应传递来的信号,称之为信号已处理或已捕获

无法将信号disposition设置为终止进程或者coredump(除非是默认行为),效果最为近似的是为信号安装一个处理器程序,并于其中调用exit()或者abort()。abort()函数为进程产生一个SIGABRT信号,该信号将引发进程coredump并终止

常见的信号值及其默认行为

信号名 信号值 描述 默认行为
SIGINT 2 终端中断 term
SIGABRT 6 终止进程 core
SIGKILL 9 必杀 term
SIGTERM 15 终止进程 term
SIGSTOP 19 必停 stop
  • kill -6让进程core,会产生coredump文件,一般用于杀死正常执行的程序
  • kill -9直接杀死进程,一般用于杀死僵尸进程
  • Ctrl+C产生SIGINT信号
posted @ 2023-11-19 09:34  SchemaL  阅读(44)  评论(0)    收藏  举报