Задачу решил с помощью ptrace().
Все работает, но одна проблема - при поступлении SIGTERM процессу, он тормозится все тем же трассировщиком. Как отключить такую излишнюю опеку, я не нашел. Самое интересное, что после возобновления работы процесс не реагирует на сигнал!
Приходится в том же обработчике убеждаться, что это SIGTERM, после чего прекращать трассировку и повторно
Вот мой порядок вызовов:
Код: Выделить всё
/* Усыновление */
ptrace (PTRACE_ATTACH, app->pid, NULL, NULL)
/* В обработчике SIGCHLD, при остановке объекта */
siginfo_t sig_orig;
ptrace (PTRACE_GETSIGINFO, info->si_pid, NULL, & sig_orig);
if (sig_orig.si_signo == SIGTERM)
{
ptrace (PTRACE_DETACH, info->si_pid, NULL, NULL);
kill (info->si_pid, SIGTERM);
goto ret_l;
}