加入收藏 | 设为首页 | 会员中心 | 我要投稿 大连站长网 (https://www.0411zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

GDB handle命令 信号处置

发布时间:2022-07-12 01:38:40 所属栏目:语言 来源:互联网
导读:C、C++ 程序中,信号常常作为进程间通信的一种重要手段。举个例子: #include stdio.h #include unistd.h #include signal.h void display(){ printf(http://c.biancheng.net/gdb/); } int main () { pid_t cpid; pid_t ppid; signal(SIGINT,display); if(
  C、C++ 程序中,信号常常作为进程间通信的一种重要手段。举个例子:
  #include <stdio.h>
  #include <unistd.h>
  #include <signal.h>
  void display(){
      printf("http://c.biancheng.net/gdb/");
  }
  int main ()
  {
      pid_t cpid;
      pid_t ppid;
      signal(SIGINT,display);
      if((cpid=fork())==0){
          printf("in cpidn");
          ppid = getppid();
          kill(ppid,SIGINT);
      }else{
          wait(NULL);
      }
      return 0;
  }
  上面程序中存在 2 个进程,分别为 cpid 子进程和 ppid 主进程。cpid 子进程通过 kill() 函数向 ppid 主进程发送了 SIGINT 信号,当主进程接收到此信号时,会由等待状态转而执行 display() 函数。因此程序的执行结果为:
  in cpid
  http://c.biancheng.net/gdb/
 
  其中,第一行为 cpid 子进程打印输出的,第二行为 cpid 向 ppid 主进程发出 SIGINT 信号后由 ppid 主进程打印输出的。
 
  值得一提的是,GDB 调试器可以自动捕获 C、C++ 程序中出现的信号,并根据事先约定好的方式处理它(具体如何约定,本节后续会讲)。Linux 系统中已经事先定义好了诸多中信号,我们可以通过执行如下命令查看:
  [root@bogon demo]# kill -l
  1) SIGHUP  2) SIGINT  3) SIGQUIT  4) SIGILL  5) SIGTRAP
  6) SIGABRT  7) SIGBUS  8) SIGFPE  9) SIGKILL 10) SIGUSR1
  11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
  16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
  21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
  .......   <-- 省略部分输出
  其中,每个信号代表着不同的含义,以 SIGINT 信号为例,它表示程序停止执行,该信号可以通过按 Ctrl+c组合键发出。换句话说,对于正在执行的程序,通过按Ctrl+c键向程序发出 SIGINT 信号,可以使程序停止执行。
 
  显然,对于现有的所有信号,GDB 调试器会根据 Stop、Print 以及 Pass 列的值进行相应的处理。当然,GDB 调试器提供了 handle 命令,由此我们就可以通过修改目标信号 Stop、Print、Pass 列的值,调试 GDB 调试器对目标信号的处理方式。
  GDB handle命令
  handle 命令的语法格式如下:
  (gdb) handle signal mode
 
  其中,signal 参数表示要设定的目标信号,它通常为某个信号的全名(SIGINT)或者简称(去除‘SIG’后的部分,如 INT);如果要指定所有信号,可以用 all 表示。
 
  mode 参数用于明确 GDB 处理该目标信息的方式,其值可以是如下几个:
  nostop:当信号发生时,GDB 不会暂停程序,其可以继续执行,但会打印出一条提示信息,告诉我们信号已经发生;
  stop:当信号发生时,GDB 会暂停程序执行。
  noprint:当信号发生时,GDB 不会打印出任何提示信息;
  print:当信号发生时,GDB 会打印出必要的提示信息;
  nopass(或者 ignore):GDB 捕获目标信号的同时,不允许程序自行处理该信号;
  pass(或者 noignore):GDB 调试在捕获目标信号的同时,也允许程序自动处理该信号。
  注意,当 GDB 捕获到信号并暂停程序执行的那一刻,程序是捕获不到信号的,只有等到程序继续执行时,信号才能被程序捕获。

(编辑:大连站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!