Core Dump 标志
在上一章节中,我们提到 Core 和 Term 默认都是终止进程,只有在一些情况会出现区别:
信号有的是可以追踪的,有的是可以不被追踪的,core dump 表示不需要被追踪了。
还记得这张图吗?当时我们在讲如果进程出现异常了,低 7 位表示退出信号,但是还有一位在那时并没有讲,而今天终于可以揭露这层面纱了。
先提出一个问题:如果我的进程出现异常了,我想不想知道是什么原因导致异常的?(像 9 号、2 号这种信号就不需要,因为这是用户自己想退出的,因此默认行为是 Term)
那肯定是想知道的,如除以 0 和野指针这种异常,我想知道是代码的哪一行导致了我的进程崩溃的。
- core dump:表示核心转储,该标志位,表示的就是退出信号的详细退出类型。
- OS 会在进程结束的时候,把进程当前运行的上下文数据,dump 转而存储到当前目录下,形成一个 core 文件!这个文件可以让我们进行调试使用,定位出错行!(一种事后调试 Post-mortem Debug)
- 一个进程允许产生多大的 core 文件取决于进程的 Resource Limit(这个信息保存在 PCB 中)。默认是不允许产生 core 文件的,因为 core 文件中可能包含用户密码等敏感信息,不安全。
- 在开发调试阶段可以用 ulimit 命令改变这个限制,允许产生 core 文件。用 ulimit 命令改变 Shell 进程的 Resource Limit,如允许 core 文件最大为 1024K:$ ulimit -c 1024.
Core vs Term
在 ulimit -c 开启 core 时,core 形式终止,会发生 core dump,term 不会;关闭时,二者等同。
int main() {
pid_t id = fork();
if (id == 0) {
// 子进程
sleep(2);
int a = 10;
a /= 0;
exit(1);
}
int status = 0;
pid_t rid = waitpid(id, &status, 0);
if (rid > 0) {
printf("exit code:%d , exit signal:%d , core dump:%d\n", (status >> 8) & 0xFF, status & 0x7F, (status >> 7) & 0x1);
}
return 0;
}
思考
- 上面所说的所有信号产生,最终都要有 OS 来进行执行,为什么?OS 是进程的管理者
- 信号的处理是否是立即处理的?在合适的时候


