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
相关产品推荐
相关产品推荐

