You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言信号处理疑问:SIGKILL注册处理矛盾及kill命令默认信号查询

问题1:给SIGKILL注册自定义处理函数是否和现有表述矛盾?

完全不存在矛盾,你的代码是因为没有做错误校验才误以为注册操作成功。

有两个信号是进程无法忽略的:SIGKILL作用为终止接收进程,SIGSTOP作用为挂起接收进程

上述表述是POSIX标准明确规定的,SIGKILL和SIGSTOP是唯一两个不允许进程捕获、忽略、阻塞的信号,设计目的是保证系统始终有能力终止或挂起异常进程,避免出现完全失控的进程无法被系统管理。

你写的C代码可以正常编译,但注册操作实际已经失败:

  • 内核会直接拦截对这两个信号的处理函数注册请求,signal(SIGKILL,sigint_handler) 调用的返回值为SIG_ERR,代表操作失败,你没有对返回值做判断才没有察觉到异常。
  • 你可以修改代码验证这个结论:
#include <signal.h>
#include <stdio.h>
#include <errno.h>

void sigint_handler(int signum) {
    printf("I'm ignoring you!\n");
}

int main() {
    if (signal(SIGKILL,sigint_handler) == SIG_ERR) {
        printf("注册SIGKILL处理函数失败,错误码:%d\n", errno);
        perror("错误原因");
    }
    for(;;) {} 
    return 0;
}

运行这段代码会直接打印注册失败的提示,错误原因通常为Invalid argument。即使你忽略错误直接运行原程序,执行kill -KILL <进程PID>也会直接杀死进程,不会触发你写的自定义处理逻辑。

问题2:终端执行kill 123默认发送什么信号?

默认发送SIGTERM信号,对应信号编号为15。

  • SIGTERM是友好的终止信号,允许进程捕获该信号后做清理工作(比如保存临时数据、释放资源、关闭连接)再优雅退出,进程也可以选择忽略这个信号。
  • 平时常说的kill -9 <pid>才是发送SIGKILL强制终止进程,9就是SIGKILL的信号编号。

内容的提问来源于stack exchange,提问作者Algo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:00:04