Как получить имя / адрес обработчика для некоторых сигналов (например, SIGINT) в Postgres? - PullRequest
6 голосов
/ 29 февраля 2012

Как получить имя / адрес обработчика для некоторых сигналов (например, SIGINT) в Postgres? Мы можем использовать сигнал (SIGINT, my_handler) для установки обработчика сигнала, но есть ли функция, которая может сообщить нам, какая функция (в данном случае my_handler) имеет дело с каким-либо сигналом (в данном случае, SIGINT)? Или мы могли бы узнать, используя GDB?

1 Ответ

10 голосов
/ 02 марта 2012

Функция, которую вы ищете: sigaction . Он принимает три аргумента, первый - это сигнал, второй - указатель на новую структуру sigaction, а третий - указатель на старую структуру sigaction (заполняется функцией). Чтобы получить текущий обработчик сигнала, вызовите sigaction со вторым аргументом, установленным в NULL. Например,

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>
...