4
如何获取Postgres中某些信号(例如SIGINT)的处理程序名称/地址?我们可以使用signal(SIGINT,my_handler)来设置信号处理程序,但是有没有一个函数可以告诉我们哪个函数(在本例中为my_handler)处理某个信号(在本例中为SIGINT)?或者我们可以找出使用GDB?如何获取Postgres中某些信号(例如SIGINT)的处理程序名称/地址?
如何获取Postgres中某些信号(例如SIGINT)的处理程序名称/地址?我们可以使用signal(SIGINT,my_handler)来设置信号处理程序,但是有没有一个函数可以告诉我们哪个函数(在本例中为my_handler)处理某个信号(在本例中为SIGINT)?或者我们可以找出使用GDB?如何获取Postgres中某些信号(例如SIGINT)的处理程序名称/地址?
您正在寻找的功能是sigaction。它有三个参数,第一个是信号,第二个是指向新的sigaction结构的指针,第三个是指向旧的sigaction结构(由函数填充)的指针。要获取当前的信号处理程序,请将第二个参数设置为NULL的sigaction进行调用。例如,
struct sigaction oldact;
sigaction(SIGINT, NULL, &oldact);
printf("SIGINT handler address: 0x%lx\n", oldact.sa_sigaction);
此方法将要求您修改源代码。
你也可以通过gdb来做到这一点,它不需要修改源代码。例如,如果您在注册信号处理程序之后附加到进程,这将起作用。
(gdb) call malloc(sizeof(struct sigaction))
(gdb) sigaction(SIGINT, NULL, $1)
(gdb) print ((struct sigaction *)$1)->sa_sigaction
(gdb) info sym <address from previous step>
如果gdb认为sigaction是一个类型而不是函数,应该使用'call __sigaction(...)'来代替。 – 2012-06-08 11:33:37