Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Убить все порожденные процессы (Solaris) / 12 сообщений из 12, страница 1 из 1
03.06.2013, 20:01
    #38284322
dimidrol99
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убить все порожденные процессы (Solaris)
Есть процесс который форкает произвольное количество других процессов. Каждый порожденный процесс может делать со своими обработчиками сигналов что угодно. Ну, демоном только не может стать. То есть у родителя работает waitpid на детей.
Родительскому процессу посылается kill -9 или он падает (отрубите мне пальцы :(( )
Есть идеи как аварийно завершить все порожденные процессы?
...
Рейтинг: 0 / 0
03.06.2013, 20:03
    #38284327
dimidrol99
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убить все порожденные процессы (Solaris)
Язык - C
...
Рейтинг: 0 / 0
03.06.2013, 22:04
    #38284395
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убить все порожденные процессы (Solaris)
Только если родитель сообщит ребенку свой пид, а ребенок будет периодически проверять жив еще родитель или нет.
...
Рейтинг: 0 / 0
03.06.2013, 22:07
    #38284397
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убить все порожденные процессы (Solaris)
И вообще, если тебе нужны дети зависящие от родителя, то делай нити. Если делаешь отдельные процессы, то они по определению не зависят от родителя.
И кстати, даже если ты делаешь waitpid() в родителе, ребенок все равно может быть демоном. Просто в этом случае твой родитель тоже вынужденно станет демоном.
...
Рейтинг: 0 / 0
04.06.2013, 00:23
    #38284503
dimidrol99
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убить все порожденные процессы (Solaris)
White OwlИ вообще, если тебе нужны дети зависящие от родителя, то делай нити. Если делаешь отдельные процессы, то они по определению не зависят от родителя.
И кстати, даже если ты делаешь waitpid() в родителе, ребенок все равно может быть демоном. Просто в этом случае твой родитель тоже вынужденно станет демоном.
При демонизации ребенка родитель получит сигнал от "демонизатора", то есть поймет что управление от него ушло : fork1 -> fork2 -> exit1 -> waitpid0 -> порожденный процесс завершился (что там дальше делается - не интересно)
Вопрос - можно ли как-то уникально маркировать процесс?
...
Рейтинг: 0 / 0
06.06.2013, 00:05
    #38287628
ДохтаР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убить все порожденные процессы (Solaris)
dimidrol99Есть процесс который форкает .... blablabla.....
kill -9 .... blablabla .....
Есть идеи как аварийно завершить все порожденные процессы?




Против kill -9 нет приема , так же как и против лома.
init обязан усыновить и упокоить деток безпредельщика пристреленного 9 сигналом.
...
Рейтинг: 0 / 0
06.06.2013, 00:27
    #38287643
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убить все порожденные процессы (Solaris)
dimidrol99При демонизации ребенка родитель получит сигнал от "демонизатора", то есть поймет что управление от него ушло : fork1 -> fork2 -> exit1 -> waitpid0 -> порожденный процесс завершился (что там дальше делается - не интересно)Да, действительно.
dimidrol99Вопрос - можно ли как-то уникально маркировать процесс?В Линуксе есть prctl(). В Соларисе.... ыыы....
Ну если там есть glib, то можно попробовать g_set_prgname()/g_get_prgname()
В общем, для glib смотри тут: https://developer.gnome.org/glib/stable/glib-Miscellaneous-Utility-Functions.html
...
Рейтинг: 0 / 0
06.06.2013, 11:02
    #38287954
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убить все порожденные процессы (Solaris)
ДохтаР
Против kill -9 нет приема , так же как и против лома.
init обязан усыновить и упокоить деток безпредельщика пристреленного 9 сигналом.


Вообще-то kill -9 вовсе не всесилен.
Просто хочу сообщить всем , чтобы не пугались, если что: бывают ситуации, когда посылка сигнала 9 не сразу или вообще не может остановить процесс.
Например, если процесс находиться внутри системного вызова, в ядре.
...
Рейтинг: 0 / 0
07.06.2013, 12:27
    #38289988
dimidrol99
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убить все порожденные процессы (Solaris)
White OwlВ Линуксе есть prctl(). В Соларисе.... ыыы....
Ну если там есть glib, то можно попробовать g_set_prgname()/g_get_prgname()
В общем, для glib смотри тут: https://developer.gnome.org/glib/stable/glib-Miscellaneous-Utility-Functions.html
В Solaris тоже есть prctl. Только не понял как Вы его предлагаете использовать в данном случае.
Там новых свойств вроде добавлять нельзя.
И, кстати, вопрос о предоставлении прав root-а даже не обсуждается.
...
Рейтинг: 0 / 0
07.06.2013, 18:02
    #38290869
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убить все порожденные процессы (Solaris)
dimidrol99White OwlВ Линуксе есть prctl(). В Соларисе.... ыыы....
Ну если там есть glib, то можно попробовать g_set_prgname()/g_get_prgname()
В общем, для glib смотри тут: https://developer.gnome.org/glib/stable/glib-Miscellaneous-Utility-Functions.html
В Solaris тоже есть prctl. Только не понял как Вы его предлагаете использовать в данном случае.
Там новых свойств вроде добавлять нельзя.
PR_SET_NAME в качестве первого параметра. Стартовый процесс ставит себе уникальное имя. А дети потом сканируют список процессов, и если не находят процесса с таким именем - считаю что родитель умер.

А впрочем, исходную задачу можно решить проще.
Ребенок при старте делает getppid(), получает pid родителя. А потом периодически снова зовет getppid() как только получил pid от init'а (ну в общем-то любой не совпадающий со стартовым). Значит у родителя проблемы.
И рутом для этой операции быть не нужно.
...
Рейтинг: 0 / 0
07.06.2013, 20:33
    #38291020
dimidrol99
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убить все порожденные процессы (Solaris)
White OwlА впрочем, исходную задачу можно решить проще.
Ребенок при старте делает getppid(), получает pid родителя. А потом периодически снова зовет getppid() как только получил pid от init'а (ну в общем-то любой не совпадающий со стартовым). Значит у родителя проблемы.

Кстати да.
Но у меня задача немного с другой стороны.
Список pid-ов запущенных родителем есть после падения. Соответственно нужно попробовать вспомнить своих детей после поднятия :)
Думаю для точной идентификации достаточно сохранить еще и время старта ребенка, типа stat на /proc/;child_pid и оттуда st_ctime
...
Рейтинг: 0 / 0
08.06.2013, 21:38
    #38291469
clihlt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Убить все порожденные процессы (Solaris)
dimidrol99White OwlА впрочем, исходную задачу можно решить проще.
Ребенок при старте делает getppid(), получает pid родителя. А потом периодически снова зовет getppid() как только получил pid от init'а (ну в общем-то любой не совпадающий со стартовым). Значит у родителя проблемы.

Кстати да.
Но у меня задача немного с другой стороны.
Список pid-ов запущенных родителем есть после падения. Соответственно нужно попробовать вспомнить своих детей после поднятия :)
Думаю для точной идентификации достаточно сохранить еще и время старта ребенка, типа stat на /proc/;child_pid и оттуда st_ctime

Незнаю как в солярке, в линухе вполне будет работать если в начале родителя стартануть процесс группу с помощью setpgid(0,0). И аварийно завершать родителя с помощью "pkill -9 -g <пид_родителя>".
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Убить все порожденные процессы (Solaris) / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]