Как убить дочерний процесс при убийстве родителя
Модератор: Модераторы
Как убить дочерний процесс при убийстве родителя
Всем доброго!
Есть задача убить дочерний процесс при убийстве родителя.
Думал, что это само собой - нет папы - нет дочери...
Использую fpFork(), fpExecv().
Убиваю родителя - дочерний живет и здравствует! Это правильно?
Есть задача убить дочерний процесс при убийстве родителя.
Думал, что это само собой - нет папы - нет дочери...
Использую fpFork(), fpExecv().
Убиваю родителя - дочерний живет и здравствует! Это правильно?
Правильно. Надо искать дочерние процессы и грохать их отдельно.
B4rr4cuda писал(а):Правильно. Надо искать дочерние процессы и грохать их отдельно.
Спасибо. Пока родитель живет, можно по OnClose убивать дочерний по его pid. Но если пользователь завершит сеанс при запущенном родителе, события OnClose не будет и дочерний процесс останется. Можно, конечно, где-то запоминать pid дочернего и при старте родителя проверять наличие дочернего... Хочется как-то попроще!
Я не совсем понял, что вы имеете в виду. При чем тут OnClose и завершение сеанса?
Если имеется в виду убитие дочерних процессов при завершении сессии системы, то ловим WM_QUERYENDSESSION и проводим нужные действия.
А вообще убийство лучше на OnDestroy вешать.. он точно должен быть вызыван при завершении сеанса.. и OnCloseQuery тоже вызывается, в отличии от onClose, хотя надо проверять...
Добавлено спустя 1 минуту 25 секунд:
Хм, а если кроссплатформа или чисто лин, то надо только на lcl завязываться.. тут точно только OnDestroy
Если имеется в виду убитие дочерних процессов при завершении сессии системы, то ловим WM_QUERYENDSESSION и проводим нужные действия.
А вообще убийство лучше на OnDestroy вешать.. он точно должен быть вызыван при завершении сеанса.. и OnCloseQuery тоже вызывается, в отличии от onClose, хотя надо проверять...
Добавлено спустя 1 минуту 25 секунд:
Хм, а если кроссплатформа или чисто лин, то надо только на lcl завязываться.. тут точно только OnDestroy
B4rr4cuda писал(а):Хм, а если кроссплатформа или чисто лин, то надо только на lcl завязываться.. тут точно только OnDestroy
Чисто лин...WM_QUERYENDSESSION - не здесь. При завершении сессии OnDestroy тоже не отрабатывается - проверял. OnCloseQuery вроде тоже не работает (проверю) - не работает - проверил.
Может, не совсем ясно изложил задачу?
Есть иксы, под ними запущено приложение. Если грохнуть иксы (завершение сеанса), то приложение естественно падает без каких-либо сообщений (или я не знаю, что обрабатывать). Ну и далее, по первоначальной задаче - как грохнуть дочерний процесс?
Ну и в идеале: захожу на удаленную машину, грохаю иксы - все отрабатывается в плане убийства дочернего приложения.
Из разряда идей - в потомках отслеживать наличие процесса родителя и убиваться, если его нет.
Возможно есть более адекватные решения, но я их не знаю. Надо экспериментировать.
Возможно есть более адекватные решения, но я их не знаю. Надо экспериментировать.
B4rr4cuda писал(а):Надо экспериментировать.
Спасибо, буду думать.
Дочерние процессы самописные? Если да, то им можно передавать ID родительского процесса, а дальше отслеживать...
Или в процедуре кнопки "Завершить" добавить убийство дочерних процессов...
Или в процедуре кнопки "Завершить" добавить убийство дочерних процессов...
PapaNT писал(а):Или в процедуре кнопки "Завершить" добавить убийство дочерних процессов...
Да это понятно. Фокус в том, чтобы убивать дочерние процессы при завершении сеанса, когда родитель убивается без следа.
-
alex208210
- постоялец
- Сообщения: 207
- Зарегистрирован: 12.05.2010 13:16:51
если процессы самописные, то дочернему можно прописать мониторинг работы родителя, если родитель умер, то убить себя.
Если линукс, дочернему отправляем вывод консоли от
ps -A | grep parrentprocess
и парсим, парсим
Если линукс, дочернему отправляем вывод консоли от
ps -A | grep parrentprocess
и парсим, парсим
alex208210 писал(а): мониторинг работы родителя, если родитель умер, то убить себя.
Здравая мысль, спасибо!
