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
相关推荐
电磁脑机3 小时前
和大脑正确交互的脑机接口研究推演理论
分布式·神经网络·架构·交互·信号处理
通信小呆呆1 天前
告别信道束缚:探究 Random Multiplexing 随机复用技术
信息与通信·信号处理·6g·随机复用
通信小呆呆1 天前
噪声体制近程雷达信号处理:从理论推导到SoC系统实现
信号处理·fpga·雷达·噪声雷达
再一次等风来2 天前
近场声全息(NAH)仿真实现:从阵列实值信号到波数域重建
算法·matlab·信号处理·近场声全息·nah
m0_555762902 天前
AD7768-4 ADC中的Sinc5是什么?
信号处理
MARIN_shen3 天前
Marin说PCB之FAKAR中心焊盘的孔径尺寸问题
硬件工程·信号处理·pcb工艺
FPGA-ADDA6 天前
第五篇(下):智能无线电与6G候选技术——从机器学习到通感一体化
人工智能·机器学习·信号处理·fpga·通信系统
NULL指向我7 天前
信号处理学习笔记5:卡尔曼滤波理论
笔记·学习·信号处理
清水白石0089 天前
Python 服务优雅停机实战:信号处理、资源收尾与 Kubernetes 滚动发布避坑指南
python·kubernetes·信号处理