3

プロセスに直接配信されたシグナルとデバッガー経由で配信されたシグナルを区別できますか?

ケース 1:

 $ ./process1
 process1 (not ptraced)
 //set up handler
 alarm(5);
 ....
 //signal is handled and I can parse handler parameters

ケース 2:

 $ debugger1 ./process1
 process1 (is ptraced by debugger1)
 //set up handler
 alarm(5);
 ...
 //signal is catched by debugger1. It resumes process1 with PTRACE_CONT,
 // signal_number is 4th parameter of PTRACE_CONT.
 //signal is redelivered to process1
 //and then is handled.

では、デバッガーによって再配信されたのか、システムによって送信されたのか、シグナルハンドラーでどのように検出できますか?

OSはLinux、カーネルは2.6.30。プログラムはプレーンな C で書かれています。実際のプログラムでは SIGALRM が使用されますが、それは ではなく で生成されalarm()ますsetitimer()

4

1 に答える 1

2

man ptrace:(http://linux.die.net/man/2/ptrace

PTRACE_GETSIGINFO(Linux 2.3.99-pre6以降)停止の原因となったシグナルに関する情報を取得します。siginfo_t構造体(sigaction(2)を参照)を子から親の位置データにコピーします。(addrは無視されます。)

PTRACE_SETSIGINFO(Linux 2.3.99-pre6以降)信号情報を設定します。親の位置データから子にsiginfo_t構造体をコピーします。これは、通常は子供に配信され、トレーサーによってキャッチされた信号にのみ影響します。これらの通常の信号を、ptrace()自体によって生成された合成信号と区別するのは難しい場合があります。(addrは無視されます。)

PTRACE_CONT停止した子プロセスを再開します。データがゼロ以外でSIGSTOPでない場合、そのデータは子に配信されるシグナルとして解釈されます。それ以外の場合、信号は配信されません。したがって、たとえば、親は子に送信された信号が配信されるかどうかを制御できます。(addrは無視されます。)

于 2010-03-30T13:16:20.140 に答える