有关Linux中内部信号处理程序表的信息



在Linux中,假设我为用户定义的信号号(比如信号10)安装了一个信号处理程序。类似于:信号(有趣,10)//fun()作为用户定义的信号10 的信号处理程序

我想知道这背后的背景是什么。我知道每个进程都有一个内部信号处理程序表。但我找不到关于那张桌子的更多信息了。

所以,我的问题是,对于一个过程。关于信号的信息和它们对应的信号处理器的地址存储在哪里?我如何通过gdb查看/检查这些信息?

在Linux中,每个任务的信号处理程序都存储在struct-sighand_struct类型的对象中

struct sighand_struct {
    atomic_t        count;
    struct k_sigaction  action[_NSIG];
    spinlock_t      siglock;
};

此对象是从structtask_struct通过sighand字段引用的。使用crash代替gdb(这是一种用于用户空间的工具)。

从task_struct:读取

crash> p/x *((struct task_struct*)0xdfcb04c0).sighand
$9 = {
  count = {
    counter = 0x4
  }, 
  action = {{
      sa = {
        sa_handler = 0x0, 
        sa_flags = 0x0, 
        sa_restorer = 0x0, 
        sa_mask = {
          sig = {0x0, 0x0}
        }
      }
    }, {
      sa = {
        sa_handler = 0x0, 
        sa_flags = 0x0, 
        sa_restorer = 0x0, 
        sa_mask = {
          sig = {0x0, 0x0}
        }
      }
    }, {
      sa = {
        sa_handler = 0x0, 
        sa_flags = 0x0, 
        sa_restorer = 0x0, 
        sa_mask = {
          sig = {0x0, 0x0}
        }
      }
    }, {
      sa = {
        sa_handler = 0x4006ac0d, 
        sa_flags = 0x10000004, 
        sa_restorer = 0x0, 
        sa_mask = {
          sig = {0x0, 0x0}
        }
      }
...

因此,我们看到,对于信号4(SIGILL,id为0的信号不存在),用户进程安装了地址0x4006ac0d指向的函数。我们可以用简单的命令来确认这一点:

crash> sig 0xdfcb04c0
PID: 19658  TASK: dfcb04c0  CPU: 0   COMMAND: "FinalizerWatchd"
SIGNAL_STRUCT: e49f33c0  NR_THREADS: 4
 SIG SIGACTION  HANDLER       MASK       FLAGS   
 [1]  e49e8004  SIG_DFL 0000000000000000 0 
 [2]  e49e8018  SIG_DFL 0000000000000000 0 
 [3]  e49e802c  SIG_DFL 0000000000000000 0 
 [4]  e49e8040 4006ac0d 0000000000000000 10000004 (SA_SIGINFO|SA_RESTART)
 [5]  e49e8054  SIG_DFL 0000000000000000 0 
 [6]  e49e8068 4006ac0d 0000000000000000 10000004 (SA_SIGINFO|SA_RESTART)
 [7]  e49e807c 4006ac0d 0000000000000000 10000004 (SA_SIGINFO|SA_RESTART)
 [8]  e49e8090 4006ac0d 0000000000000000 10000004 (SA_SIGINFO|SA_RESTART)

在这里阅读更多关于信号处理的信息,在这里阅读关于崩溃的信息

相关内容

  • 没有找到相关文章

最新更新