Отправьте сигнал на lighttpd и сигнал может быть обработан библиотекой LD_PRELOAD
Привет!:) Я хочу запустить сервер lighttpd с библиотекой LD_PRELOADed, моя библиотека LD_PRELOADed называется signal.so, и ее код выглядит так:
#include <signal.h>
struct sigaction sgSA;
static void handler(int signo, siginfo_t *si, void *ptr)
{
if(signo == SIGHUP)
printf("Get a signal -- SIGHUP\n");
}
sgSA.sa_flags = SA_SIGINFO;
sigemptyset(&sgSA.sa_mask);
sgSA.sa_sigaction = handler;
if (sigaction(SIGHUP, &sgSA, NULL) == -1)
handle_error("sg sigaction");
raise(SIGHUP);
и когда я запускаю программу с библиотекой, используя команду:
$sudo LD_PRELOAD=./signal.so ./lighttpd -f /usr/local/lighttpd/config/lighttpd.conf
Он не печатает строку "Получить сигнал - SIGHUP", и я пробовал это на другой простой программе вместо сервера lighttpd, он действительно может печатать эту строку. Это меня сильно поразило. Итак, мой вопрос: как я могу сделать так, чтобы обработчик сигнала обрабатывал мою библиотеку LD_PRELOAD? Tks!
1 ответ
На первый взгляд, я подумал, что lighttpd может поймать некоторые сигналы в своей логике кода, которая переопределяет LD_PRELOAD
Код обработки сигналов. Поэтому я искал базу кода lighttpd и обнаружил, что он действительно ловит некоторые сигналы, такие как SIGINT
, SIGHUP
в src/server.c
,
Я пытался поймать сигнал как SIGUSR2
(не пойман lighttpd) с LD_PRELOAD
, но он все равно ничего не печатает. С помощью strace
чтобы распечатать журнал системных вызовов, он показывает, что мы уже ввели предварительно загруженный SIGUSR2
обработчик сигнала (write(1, "Get a signal ...")
). Похоже, по каким-то причинам lighttpd подавлен printf
от печати журналов до консоли.