Отправьте сигнал на 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 от печати журналов до консоли.

Другие вопросы по тегам