03 / 信号的5种默认处理动作
当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。
core.c
#include <stdio.h>
#include <string.h>
int main(){
char* buf;//buf是一个野内存,操作了野内存,出现段错误
strcpy(buf,"hello");
return 0;
}
问题:为什么我设置了core file size还是生成不了core文件?
我的系统是ubuntu,cat /proc/sys/kernel/core_pattern之后输出|/usr/share/apport/apport %p %s %c %d %P %E,查了之后发现ubuntu预装了apport错误收集系统,sudo service apport stop之后就可以了。
ulimit -a
首先:sudo service apport stop
改文件的大小,ulimit -c 1024
此时用ulimit -a 查看文件的大小
gcc core.c -g
执行./a.out
然后gdb a.out
查看错误信息:core-file core
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid,int sig);
kill - send signal to a process
- 功能:给任何的进程或者进程组pid,发送任何的信号 sig
- 参数:
- pid :
> 0 : 将信号发送给指定的进程
= 0 : 将信号发送给当前的进程组
= -1 : 表示将信号发送给每一个有权限接收这个信号的进程
< -1 : 这个pid=某个进程组的ID取反(-12345)
- sig : 需要发送的信号的编号或者是宏值,表示不发送任何信号
kill(getppid(),9);
kill(getpid(),9);
int raise(int sig);
raise - send a signal to the caller
- 功能:给当前进程发送信号
- 参数:
- sig : 要发送的信号
- 返回值:
- 成功 0
- 失败 非0
kill(getpid(),sig);
void abort(void);
- 功能:发送SIGABRT信号给当前的进程,杀死当前进程
- kill(getpid(),SIGABRT)
kill.c
/*
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid,int sig);
kill - send signal to a process
- 功能:给任何的进程或者进程组pid,发送任何的信号 sig
- 参数:
- pid :
> 0 : 将信号发送给指定的进程
= 0 : 将信号发送给当前的进程组
= -1 : 表示将信号发送给每一个有权限接收这个信号的进程
< -1 : 这个pid=某个进程组的ID取反(-12345)
- sig : 需要发送的信号的编号或者是宏值,表示不发送任何信号
kill(getppid(),9);
kill(getpid(),9);
int raise(int sig);
raise - send a signal to the caller
- 功能:给当前进程发送信号
- 参数:
- sig : 要发送的信号
- 返回值:
- 成功 0
- 失败 非0
kill(getpid(),sig);
void abort(void);
- 功能:发送SIGABRT信号给当前的进程,杀死当前进程
- kill(getpid(),SIGABRT)
*/
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
int main(){
pid_t pid = fork();
if(pid == 0){
//子进程
int i=0;
for(i = 0;i < 5; i++){
printf("child process\n");
sleep(1);
}
}else if(pid > 0){
//父进程
printf("parent process\n");
sleep(2);
printf("kill child process now\n");
kill(pid,SIGINT);
}
return 0;
}