определить отправителя сигнала (linux, ptrace) - PullRequest
3 голосов
/ 29 марта 2010

Можно ли различить сигнал между доставкой непосредственно процессу и доставкой через отладчик.

Дело 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.

Итак, как я могу обнаружить в обработчике сигналов, был ли он доставлен отладчиком или отправлен системой?

ОС - Linux, ядро ​​- 2.6.30. Программы написаны на простом C. В реальной программе используется SIGALRM, но она генерируется не alarm(), а setitimer().

1 Ответ

2 голосов
/ 30 марта 2010

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

PTRACE_GETSIGINFO (начиная с Linux 2.3.99-pre6) Получить информацию о сигнале, который вызвал остановку. Копирует структуру siginfo_t (см. sigaction (2) от ребенка к данные о местоположении в родительском. (адрес игнорируется.)

PTRACE_SETSIGINFO (начиная с Linux 2.3.99-pre6) Установить информацию о сигнале. Копирует структуру siginfo_t из данные о местоположении в родительском ребенок. Это повлияет только на сигналы что обычно доставляется ребенок и был пойман трейсера. Это может быть трудно сказать эти нормальные сигналы от синтетического сигналы, сгенерированные ptrace () сама . (адрес игнорируется.)

PTRACE_CONT Перезапускает остановленный дочерний процесс. Если данные ненулевые и не SIGSTOP, это интерпретируется как сигнал для доставки ребенку; в противном случае сигнал не доставляется. Так, например, родитель может контролировать, отправляется ли сигнал на ребенок доставлен или нет. (адрес игнорируется.)

...