Linux 信号处理:Core vs Term 解析

一、信号core 与 Trem

动作类型 缩写 含义 典型信号
终止 + 核心转储 Core 进程终止,并生成 core dump 文件 SIGQUIT, SIGILL, SIGABRT, SIGFPE, SIGSEGV
仅终止 Term 进程直接终止,不生成 core 文件 SIGHUP, SIGINT, SIGKILL, SIGTERM, SIGPIPE

二、Core Dump

2.1 什么是 Core Dump?

Core Dump = 核心转储 = 进程内存的"现场快照"

2.2 为什么"没见过" Core 文件?

云服务器上,core dump 功能是被禁止掉的!

2.3 如何开启 Core Dump?

复制代码
# 1. 查看当前限制
$ ulimit -a | grep core
core file size          (blocks, -c) 0

# 2. 临时开启(当前 shell 有效)
$ ulimit -c unlimited        # 不限制大小
$ ulimit -c 40960           # 限制 40960 blocks(约 20MB)

# 3. 验证设置
$ ulimit -a | grep core
core file size          (blocks, -c) 40960

# 4. 永久开启(写入配置文件)
$ echo "ulimit -c unlimited" >> ~/.bashrc

生成并分析 Core 文件

复制代码
# 测试程序:触发除零错误
$ cat > test_sig.c << 'EOF'
#include <stdio.h>

int main() {
    int a = 10;
    int b = 0;
    int c = a / b;  // SIGFPE
    printf("%d\n", c);
    return 0;
}
EOF

$ gcc -o test_sig test_sig.c -g  # -g 保留调试信息

# 运行,生成 core 文件
$ ./test_sig
Floating point exception (core dumped)

# 查看生成的 core 文件
$ ls -lh core*
-rw------- 1 user user 2.3M Apr  6 10:30 core.1234

# 使用 gdb 分析
$ gdb ./test_sig core.1234
(gdb) bt          # 查看调用栈
(gdb) info locals # 查看局部变量
(gdb) list        # 查看源代码

三、为什么会核心转储

支持debug !

开启 core dump , 直接运行崩溃 , gdb , core - file core ,直接帮助我们定位到出错行!

复制代码
#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <functional>
#include <vector>
#include <cstdio>
#include <sys/wait.h>

int main()
{
    pid_t id = fork();
    if (id == 0)
    {
        sleep(2);
        printf("hello world!\n");
        printf("hello world!\n");
        printf("hello world!\n");
        printf("hello world!\n");
        printf("hello world!\n");
        int a = 0;
        a /= 0;
        printf("go home!\n");
        exit(1);
    }
    int status = 0;
    waitpid(id, &status, 0);
    printf("signal: %d, exit code: %d, core dump: %d\n", (status & 0x7F),
           (status >> 8) & 0xFF, (status >> 7) & 0x1);
    return 0;
}

总结:

要点 一句话总结
Core 是调试工具 程序崩溃时的内存快照,用于事后分析
Term 是干净退出 外部干预时的正常终止,不保留现场
云服务器默认禁 Core 通过 ulimit -c 0 限制,防止磁盘爆满
Core 文件可能很大 与进程 RSS 相当,大进程可能产生 GB 级 core
必须用 -g 编译 没有调试信息,gdb 无法定位源代码行
信号编号看低7位 status & 0x7F 得到终止信号
Core 标志看第8位 (status >> 7) & 1 表示是否产生 core
相关推荐
流浪0012 天前
Linux系统篇34——信号(六):信号处理期间又来了怎么办?——sigaction、sa_mask、可重入函数与 volatile
linux·运维·面试·操作系统·信号处理·信号
科恒盛远3 天前
ZU902 FMC194 可编程宽带信号源实测
fpga开发·硬件工程·信号处理
联丰迅声3 天前
参数表上三个“dB”,选声学成像仪到底该盯哪个?
信号处理·传感器·工业自动化·mems·声学成像
expipi刘家伟3 天前
RFSOC 信号采集处理模块
信号处理·rfsoc·阵列信号采样
Lsir10110_4 天前
从按钮“点不动“讲起——深入理解 Qt 信号槽机制
开发语言·qt·信号处理
菜鸟~noob2335 天前
【电子战】 第09篇:阵列信号处理——波束形成、MVDR、MUSIC【含matlab代码】
开发语言·matlab·信号处理
2501_929807255 天前
专业140+总分430+武汉理工大学855信号与系统考研武理工,电子信息和通信工程,真题大纲,参考书
考研·信息与通信·信号处理·通信·电子信息
学习FPGA的电气小兴兴7 天前
基于FPGA的CORDIC旋转模式实现sin和cos运算
fpga开发·信号处理·数字信号处理·verilog·fpga·verilog hdl·cordic
复方金银花颗粒8 天前
reactor和proactor的好处和坏处。为什么要用reactor而不用 proactor?
后端·信号处理
粉色挖掘机8 天前
关于z平面的一些理解与总结
信号处理·z变换·滤波器