Russian Qt Forum
Ноябрь 23, 2024, 00:35
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Компиляторы и платформы
>
Linux
>
Как терминировать процесс со всеми его потомками в Linux(Mac)
Страниц: [
1
]
2
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Как терминировать процесс со всеми его потомками в Linux(Mac) (Прочитано 22455 раз)
spectre71
Гость
Как терминировать процесс со всеми его потомками в Linux(Mac)
«
:
Июнь 25, 2009, 10:55 »
Есть приложение запускающее процессы(различные консольные программы) из под себя.
Процесс запускаемый непосредственно данным приложением будем называть Родительским.
Родительским процесс в свою очередь может запускать из-под себя другие процессы, которуе в свою очередь так же могут запускать процессы,
назовем все процессы порожденные Родительским прямо или косвенно Дочерними.
Приложению не известно создаются ли Дочернии процессы Родительским.
Приложение в любой момент может убить Родительский процесс. Задача убить все его Дочернии процессы.
Под Windows данная задача решена. Создаем JobObject (CreateJobObject(...)), далее после создания Родительского процесса в SUSPENDED режиме делаем AssignProcessToJobObject, и делаем ResumeThread для гланого потока Родительского процесса. Теперь если наш Родительский процесс породит какие-либо Дочернии процессы, они будут автоматически ассоциированы с JobObject. Теперь при терминировании JobObject все ассоциированные с ним процессы будут терминированы! Причем вне зависимости завершился ли Родительский процесс или завис или еще чего.
Как решить эту задачу под Linux(Mac) я не нашел. Может в Linux(Mac) вообще такой возможности нет?
Помогите знающие люди!
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Как терминировать процесс со всеми его потомками в Linux(Mac)
«
Ответ #1 :
Июнь 25, 2009, 11:25 »
в линуксе есть такая штука как "группа", причем, если мне не изменяет память то сигнал рассылается всей группе => нужно слать сигнал родителю (если надо, могу откопать коды 2ого курса где нас учили работать с процессами, если помнится то в shell'е, к-ый нас заставляли писать как раз была смена группы чтоб не гробить процессы в бекграунде по SIGTERM самому шеллу)
Записан
spectre71
Гость
Re: Как терминировать процесс со всеми его потомками в Linux(Mac)
«
Ответ #2 :
Июнь 25, 2009, 11:33 »
Цитата: Авварон от Июнь 25, 2009, 11:25
в линуксе есть такая штука как "группа", причем, если мне не изменяет память то сигнал рассылается всей группе => нужно слать сигнал родителю (если надо, могу откопать коды 2ого курса где нас учили работать с процессами, если помнится то в shell'е, к-ый нас заставляли писать как раз была смена группы чтоб не гробить процессы в бекграунде по SIGTERM самому шеллу)
С группами я пытался разобраться, но так и не понял как применить их к моей задаче, если знаешь помоги!
С другой стороны слать сигнал родителю точно безсмысленно, пример:
Родитель порождает Дочерний процесс и сразу завершается, а Дочерний процесс продолжает работать.
Записан
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Как терминировать процесс со всеми его потомками в Linux(Mac)
«
Ответ #3 :
Июнь 25, 2009, 11:41 »
а нельзя например родителю, когда он создаёт потомство - как то узнать PID этих потомков.. и потом если вдруг он завершается - то по этим PID - ам происходит kill (например в деструкторе родителя)
не? или я опять костыль придумал?
Записан
ArchLinux x86_64 / Win10 64 bit
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Как терминировать процесс со всеми его потомками в Linux(Mac)
«
Ответ #4 :
Июнь 25, 2009, 11:50 »
а родитель како-то левый или тобой написанный?
Записан
spectre71
Гость
Re: Как терминировать процесс со всеми его потомками в Linux(Mac)
«
Ответ #5 :
Июнь 25, 2009, 11:54 »
Цитата: kuzulis от Июнь 25, 2009, 11:41
а нельзя например родителю, когда он создаёт потомство - как то узнать PID этих потомков.. и потом если вдруг он завершается - то по этим PID - ам происходит kill (например в деструкторе родителя)
не? или я опять костыль придумал?
Смешно!
Родитель запущенный процесс - любая консольная программа! Какой может быть деструктор родителя
Записан
spectre71
Гость
Re: Как терминировать процесс со всеми его потомками в Linux(Mac)
«
Ответ #6 :
Июнь 25, 2009, 11:56 »
Цитата: Авварон от Июнь 25, 2009, 11:50
а родитель како-то левый или тобой написанный?
Любая консольная программа и для моего приложения - черный ящик!
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Как терминировать процесс со всеми его потомками в Linux(Mac)
«
Ответ #7 :
Июнь 25, 2009, 12:13 »
гм, ну если известен процесс, то пид можно получить через ps. аналогично через нее же можно выцепить и все прцессы с ппидом, равным пиду родительского и пригробить их поштучно...
а группы немного не то, или я чего-то не понимаю)
Записан
spectre71
Гость
Re: Как терминировать процесс со всеми его потомками в Linux(Mac)
«
Ответ #8 :
Июнь 25, 2009, 12:28 »
Цитата: Авварон от Июнь 25, 2009, 12:13
гм, ну если известен процесс, то пид можно получить через ps. аналогично через нее же можно выцепить и все прцессы с ппидом, равным пиду родительского и пригробить их поштучно...
а группы немного не то, или я чего-то не понимаю)
В общем случае невозможно!
1) Неизвестены моменты запуска Дочерних процессов.
2) Пид родителя у Дочернего может сменниться, и ситуаций здесь много, пример:
Родитель в какой-то момент порождает Дочерний процесс и быстро завершается, а Дочерний процесс продолжает работать.
Даже если постоянно мониторить пиды(что очень накладно), можно промазать и пропустить момент - порождение Дочернего+изменение у него пида родителя.
Записан
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Как терминировать процесс со всеми его потомками в Linux(Mac)
«
Ответ #9 :
Июнь 25, 2009, 13:06 »
а если почитать про принцип формирования PID-ов в линуксе и уже исходя от этого плясать?
1. есть ли какая нить закономерность в PID-ах родителя и дочерних? т.е. можно как-то узнать по PID-у какго нить выборочного процесса, кто его родитель??
2. если так можно, то приложение при запуске своего процесса просто запоминает его PID... и если вдруг оно "прибивает" этот процесс, то
с помошью ps можно найти все PID-ы дочерних и поддочерних и подподдочерних процессов (например по маске или как нить так - я хез, нужно читать про ps, kill и т.п.) и прибить их все!
Но это если все-таки есть какая-то связь м\у PID ами (я хез )
можно и так как говорит Авварон , например после прибития главного процесса - в течении определенного времени мониторить систему и прибивать дочерние процессы которые создают новые и новые!!!
например в течении 30 секунд и т.п.
ЗЫ: и тут хто его знает кто победит - или живучие дочерние, которые постоянно рожают новых.. или твое приложение, которое их прибивает
«
Последнее редактирование: Июнь 25, 2009, 13:10 от kuzulis
»
Записан
ArchLinux x86_64 / Win10 64 bit
spectre71
Гость
Re: Как терминировать процесс со всеми его потомками в Linux(Mac)
«
Ответ #10 :
Июнь 25, 2009, 13:21 »
Я только-что писал:
Цитата: Spectre от Июнь 25, 2009, 12:28
В общем случае невозможно!
1) Неизвестены моменты запуска Дочерних процессов.
2)
Пид родителя у Дочернего может сменниться
, и ситуаций здесь много, пример:
Родитель в какой-то момент порождает Дочерний процесс и быстро завершается, а Дочерний процесс продолжает работать.
Даже если постоянно мониторить пиды(что очень накладно),
можно промазать
и пропустить момент -
порождение Дочернего+изменение у него пида родителя.
Если Пид родителя у Дочернего сменился его не найти!!!
Записан
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Как терминировать процесс со всеми его потомками в Linux(Mac)
«
Ответ #11 :
Июнь 25, 2009, 13:23 »
А как он сменится? о_О он же вроде всегда один и тот же.. процесс запустили, пид присвоился и все.... и с этим пидом он и буит "всю жизнь" пока не прихлопнут.. не?
«
Последнее редактирование: Июнь 25, 2009, 13:25 от kuzulis
»
Записан
ArchLinux x86_64 / Win10 64 bit
spectre71
Гость
Re: Как терминировать процесс со всеми его потомками в Linux(Mac)
«
Ответ #12 :
Июнь 25, 2009, 13:29 »
Цитата: kuzulis от Июнь 25, 2009, 13:23
А как он сменится? о_О он же вроде всегда один и тот же.. процесс запустили, пид присвоился и все.... и с этим пидом он и буит "всю жизнь" пока не прихлопнут.. не?
Ничего подобного.
По Linux если родительский процесс завершился тем или иным образом, все его дочерние перепривязываются к какому-то там системному процессу.
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: Как терминировать процесс со всеми его потомками в Linux(Mac)
«
Ответ #13 :
Июнь 25, 2009, 14:12 »
к иниту, процессу с номером 1...
Записан
spectre71
Гость
Re: Как терминировать процесс со всеми его потомками в Linux(Mac)
«
Ответ #14 :
Июнь 25, 2009, 14:30 »
Цитата: Авварон от Июнь 25, 2009, 14:12
к иниту, процессу с номером 1...
Именно!
Вот по этому и нужен некоторый системный механизм для регистрации(или группировки) всех Дочерних процессов.
Для Windows это делается через JobObject.
Что делать под Linux?
Записан
Страниц: [
1
]
2
3
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...