2017-01-16 9 views
0

こんにちはで扱うことができ、私のLD_PRELOADedライブラリーと呼ばれるsignal.soをし、それがこのようなコードです:はlighttpdのに信号を送信し、私はLD_PRELOADedライブラリとlighttpdのサーバーを実行したい:)信号がLD_PRELOADedライブラリが

#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_PRELOADedライブラリのハンドラによって処理されるようにするにはどうしたらよいですか? Tks!

+0

まず、ライブラリが 'LD_PRELOAD'-edであるかどうかを確認してください(setuidバイナリは無視します)。また、 'lighttpd'は後でハンドラをリセットして、' signal'と 'sigaction'を傍受してそのように見えるようにします。 – yugr

+0

私は特定のレスソンを確認していませんが、lighttpdは常に自分自身のハンドラにトラップしているようです。したがって、代わりに予約信号SIGUSR2を使用して解決できます。あなたの提案をありがとう。 –

答えて

0

一見して、lighttpdは、コード信号ロジックを無効にして、信号処理コードLD_PRELOADを無効にすると考えました。そこで、lighttpdのコードベースを調べて、SIGINT,SIGHUPなどの信号を受け取りました。src/server.cです。

SIGUSR2(lighttpdにはキャッチされていません)のような信号をLD_PRELOADでキャッチしようとしましたが、それでも何も印刷されません。 straceを使用してシステムコールログを出力すると、事前にロードされたSIGUSR2シグナルハンドラ(write(1, "Get a signal ..."))がすでに入力されていることがわかります。だから、いくつかの理由から、lighttpdはprintfを印刷ログからコンソールに抑制したようです。

+0

lighttpdは、* stdin *と* stdout *を/ dev/nullに開きます。 * stderr *をコンソールに移動させたい場合は、lighttpd.confにserver.errorlogまたはserver.breakagelogを定義しないでください – gstrauss

関連する問題