Усыновление процесса (Или как еще узнать вовремя о его завершении)

Модератор: Модераторы разделов

nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Усыновление процесса

Сообщение nick87720z »

Начал работу над модульным менеджером сеансов, пока работаю над стартером. Хочу реализовать включение и исключение из сеанса уже работающих приложений.
Задачу решил с помощью ptrace().
Все работает, но одна проблема - при поступлении SIGTERM процессу, он тормозится все тем же трассировщиком. Как отключить такую излишнюю опеку, я не нашел. Самое интересное, что после возобновления работы процесс не реагирует на сигнал!
Приходится в том же обработчике убеждаться, что это SIGTERM, после чего прекращать трассировку и повторно :ohmy: посылать этот сигнал.

Вот мой порядок вызовов:

Код: Выделить всё

/* Усыновление */
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;
}
Спасибо сказали:
nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Re: Усыновление процесса

Сообщение nick87720z »

Cовсем забыл: Calculate, Ядро 3.3.5-calculate, glibc 2.14.1-r3.
Спасибо сказали:
nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Re: Усыновление процесса

Сообщение nick87720z »

Проблему с реакцией на события трассируемого процесса решил, случайно еще раз прочитав мануал для ptrace (для команды PTRACE_CONT аргумент data - номер сигнала, от которого и зависит, будет ли он отправлен).

Код: Выделить всё

siginfo_t sig_orig;
ptrace (PTRACE_GETSIGINFO, info->si_pid, NULL, & sig_orig);
ptrace (PTRACE_CONT, info->si_pid, NULL, sig_orig.si_signo);


P.S. В вызове ptrace (PTRACE_GETSIGINFO,...) совсем нет необходимости, т.к. причина (номер сигнала) уже содержится в статуте waitpid после проверки WIFSTOPED ().
Спасибо сказали: