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;
} 
 

















![[golang gin框架] 41.Gin商城项目-微服务实战之后台Rbac微服务(用户登录 、Gorm数据库配置单独抽离、 Consul配置单独抽离)](https://img-blog.csdnimg.cn/fdfc04e10b6c45d794307dfcf0c0c753.png)

