linux下信号以及gdbt调试

本文详细介绍了Linux下的信号处理机制,包括信号的生命周期、注册、注销及处理方式,如默认处理、忽略处理和自定义处理。通过实例展示了如何使用`signal`和`sigaction`函数自定义信号回调函数,以及`gdb`调试工具的使用。文章还探讨了信号的阻塞和未决状态,并区分了可靠和非可靠信号的区别。
摘要由CSDN通过智能技术生成

int main(){
char *ptr=null;
memcpy(ptr,“nihao”,6)
return 0}
运行结果为 segmentation fault(core dumped)
为段错误,内存访问错误
gdb ./neicuncuowu
(gdb) r
Program received signal SIGSEGV,(程序接受到了一个信号) Segmentation fault.(内存段错误)
0x00007ffff7b64c95 in __memcpy_ssse3_back () from /lib64/libc.so.6
基本认识:
通知时间的发生–软中断–通知事件中断
信号有不同的种类:每个信号都对应了不同的事件
信号的生命周期:产生–>处理
kill -l查看当前系统所有信号62种信号(1-31)每个都有各自对应的事件(非可靠信号/非实时信号)
非可靠信号可能会丢失(肚子饿了发很多信号但是只吃了一次),值处理了一次其他信号丢失
(34-64)后继加的(可靠信号/实时信号)
可靠信号(发送几次信号就吃几次饭),法几次信号处理多少次
实时/非实时:是否会立即处理

  1. SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
  2. SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
  3. SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
  4. SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
  5. SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
  6. SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
  7. SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
  8. SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
  9. SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
  10. SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
  11. SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
  12. SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
  13. SIGRTMAX-1 64) SIGRTMAX
    信号的生命周期:产生–>注册–>注销–>处理 阻塞
    信号的产生:
    ctrl +c ctrl +| crtl +z
    $ ./eg
    nihaoshijie–
    nihaoshijie–
    ^C
    按下contl+c是硬件cpu捕捉到一个硬件电信号操纵系统把硬件产生的电信号解释成一个软件信号2号信号(终断)SIGINT发给前台进程(运行在终端上的进程./eg)
    contl+|退出信号3号信号(SIGQUIT)
    contrl+z停止信号********
    kill +pid 默认杀死的信号是SIGTERM终止
    kill -9 就是强杀信号(SIGKILL)
    软件: kill命令产生一个信号 kill -signo pid 命令 kill() raise() abort() alarm() 程序异常
    vim /usr/include/bits/signum.h
    看信号的作用
    /* Signals. /
    32 #define SIGHUP 1 /
    Hangup (POSIX). /
    33 #define SIGINT 2 /
    Interrupt (ANSI). /
    34 #define SIGQUIT 3 /
    Quit (POSIX). /
    35 #define SIGILL 4 /
    Illegal instruction (ANSI). */
    int main(){
    4 //int kill(pid_t pid,int sig);
    5 //给指定进程发送指定信号

    E> 6 kill(getpid(),11);//kill(getpid(),SIFSEGV)
    7 //发送11号信号
    8 while(1){
    9 printf(“nihaoa —\n”);
    10 sleep(1);
    11 }
    12 return 0;
    }
    运行结果:
    ./loop
    段错误(吐核)
    给进程发送一个11号信号
    //int raise(int sig);//给自己(调用进程/线程)发送一个信号不用指定ID
    10 raise(SIGQUIT);//3号信号
    11 while(1){
    12 printf(“nihaoa —\n”);
    13 sleep(1);
    14 }
    [chenyongjie@localhost signal]$ ./loop
    退出(吐核)
    // void abort(void),给一个进程发送一个SIGABRT信号给调用进程发
    13 abort();
    14 while(1){
    15 printf(“nihaoa —\n”);
    16 sleep(1);
    17 }
    18 return 0;
    头文件为stdlib
    ./loop
    已放弃(吐核)

#include <unistd.h>
unsigned int alarm(unsigned int seconds);

15 // seconds秒之后给调用进程发送SIGALRM信号,seconds为0取消定时器
16 // 返回值值返回上一个定时器剩余的时间或者为0(之前没有定时器为0)

int ret= alarm(3);
18 while(1){
19 printf(“nihaoa —[%d]\n”,ret);
20 sleep(1);
21 }
22 return 0;
l]$ ./loop
nihaoa —[0]
nihaoa —[0]
nihaoa —[0]
闹钟
三秒钟后收到定时器信号结束
int ret= alarm(3);
18 sleep(1);
19 ret=alarm(0);
20 while(1){
21 printf(“nihaoa —[%d]\n”,ret);
22 sleep(1);
23 }
24 return 0;
等于0则取消定时器
[chenyongjie@localhost signal]$ ./loop
nihaoa —[2]
睡了1秒剩余2秒,所以上一个定时器还剩下两秒时间才到
core dumped–核心转储文件–程序异常退出时候保存程序的运行信息–方便事后调试
core dumped --默认关闭–占磁盘资源,安全性考虑
如何设置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值