С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Я в этом не шарю
 Аватар для Segaman
4 / 4 / 3
Регистрация: 03.09.2014
Сообщений: 191

Как завершить дочернее приложение если родительское было завершено?

15.07.2015, 13:13. Показов 1390. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ситуация такая.
Есть родительское приложение. Оно создаёт дочерний процесс, с которым общается через сокет.
Иногда случается, что родительское приложение падает (проблемы разработки или просто сбои).
Так вот нужно чтобы дочернее приложение завершалось автоматически, если родительское было завершено, но как такое проделать я не знаю.
Просто сигналом из сокета об отсутствии соединеия ограничиться не получится, родительское может падать в следствии ошибки и тогда дочернее останется висеть в памяти без действий.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.07.2015, 13:13
Ответы с готовыми решениями:

Как блокировать родительское окно, пока открыто дочернее?
Есть главное окно, с него по кнопке вызывается другое окно с текстбоксом. Главное при этом не скрывается. Как запретить пользователю...

Как догрузить до конца вначале дочернее окно, а потом родительское
Такая проблема: дочернее окно появляется, но не загружается до тех пор пока до конца не догрузится родительское. Нужно чтобы дочернее...

Распределить задачи по процессорам так, чтобы выполнение всех задач было завершено в кратчайший срок
не могу понять в чем ошибка вот условие задачи Даны m одинаковых процессоров и n независимых задач, каждая из которых может решаться на...

8
2 / 2 / 3
Регистрация: 07.10.2013
Сообщений: 48
16.07.2015, 14:02
Я далеко не специалист, но решил бы так:
1. при создании дочернего процесса получаем его process id(pid) и убиваем дочерний процесс при завершении или
2. в обработчике сокета дочернего реагировал бы на специальный символ, при котором процесс самоубивается (или вызывается garbage collector принудительно).
Насчет ошибок : я бы заключил все в блоки try...catch и при возникновении делал бы то, что описал вверху.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
16.07.2015, 15:18
Цитата Сообщение от Segaman Посмотреть сообщение
родительское приложение падает
Ну пусть бросается исключением в дочерний процесс.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.07.2015, 12:04
Цитата Сообщение от Segaman Посмотреть сообщение
Иногда случается, что родительское приложение падает (проблемы разработки или просто сбои).
Так вот нужно чтобы дочернее приложение завершалось автоматически, если родительское было завершено, но как такое проделать я не знаю.
Просто сигналом из сокета об отсутствии соединеия ограничиться не получится, родительское может падать в следствии ошибки и тогда дочернее останется висеть в памяти без действий.
сразу скажу, не специалист.

но думаю, что такой сценарий может прокатить:

родитель при создании ребенка может сообщить ему свой хэндл.
ребенок фиксит, что родитель долго не отвечает, пробивает хэндл.
через него он узнает статус родителя.
и если процесс - мертв, то самоликвидируется.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
17.07.2015, 13:24
Цитата Сообщение от hoggy Посмотреть сообщение
родитель при создании ребенка может сообщить ему свой хэндл.
ребенок фиксит, что родитель долго не отвечает, пробивает хэндл.
через него он узнает статус родителя.
и если процесс - мертв, то самоликвидируется.
А если ребенок прошляпил и данный хендл уже отдан системой другому процессу? Не пойдет.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.07.2015, 14:05
Цитата Сообщение от SatanaXIII Посмотреть сообщение
А если ребенок прошляпил и данный хендл уже отдан системой другому процессу? Не пойдет.
ребенок при запуске хапнул хэндл папаши.
и теперь пока он его не отпустит, система никому такой же не отдаст.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
17.07.2015, 15:07
Цитата Сообщение от hoggy Посмотреть сообщение
ребенок при запуске хапнул хэндл папаши.
и теперь пока он его не отпустит, система никому такой же не отдаст.
То есть присвоить двум процессам один и тот же хендл?
Цитата Сообщение от hoggy Посмотреть сообщение
ребенок фиксит, что родитель долго не отвечает, пробивает хэндл
А хендл ему и принадлежит. То есть в системе зарегистирован, все хорошо. А родитель уже мертв.

Я все еще не пойму задумки.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.07.2015, 17:27
Цитата Сообщение от SatanaXIII Посмотреть сообщение
То есть присвоить двум процессам один и тот же хендл?
не присвоить, а передать.

при создании процесса, в системе создается некий объект ядра.

когда процесс помирает, этот объект ядра ещё какое то время существует.
чуть позже, система его подчищает за ненадобностью.

если у вашего процесса достаточно прав,
то вы можете заполучить к себе хэндл чужого процесса.
например, с помощью функции ::OpenProcess

в этом случае получится,
что на один и тот же объект ядра ссылаются два открытых хэндла,
из двух разных процессов.

и теперь, пока оба эти хэндла не будут закрыты,
объект ядра будет существовать,
даже если породивший его родительский процесс подохнет.

тобишь, родительского процесса уже давно нет в живых.
но объект ядра ассоциированный с ним остается жить,
пока существует хотя бы один открытый хэндл,
который на него ссылается.

по этому хэндлу, ребенок сможет пробить информацию о состоянии объекта ядра.
и узнать: жив ли ещё родительский процесс, или канул в лету.
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
17.07.2015, 18:06
Цитата Сообщение от Segaman Посмотреть сообщение
Иногда случается, что родительское приложение падает (проблемы разработки или просто сбои).
Так вот нужно чтобы дочернее приложение завершалось автоматически, если родительское было завершено, но как такое проделать я не знаю.
Обсуждалось уже несколько раз.
Создаете job-объект, задаете для него параметры через SetInformationJobObject +
JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE, далее помещаете дочерний процесс в job.
Хэндл job-объекта закрывать не нужно. Когда родительский процесс завершится,
вместе с ним система прибъет и все дочерние, являющиеся частью job-а.

Цитата Сообщение от SatanaXIII Посмотреть сообщение
А если ребенок прошляпил и данный хендл уже отдан системой другому процессу?
На этот случай есть наследование хэндлов (handle inheritance, см. в MSDN).
Еще до создания дочернего процесса родительский может открыть себя с
параметрами bInheritHandle = TRUE в SECURITY_ATTRIBUTES и тогда дочерний
процесс автоматически унаследует хэндл родителя (при условии, что CreateProcess
вызывается с bInheritHandles = TRUE). А пока существует хотя бы один
хэндл процесса, система не выдаст его ID кому-то другому:

PROCESS_INFORMATION structure
https://msdn.microsoft.com/en-... 85%29.aspx
dwProcessId

A value that can be used to identify a process. The value is valid from the
time the process is created until all handles to the process are closed and
the process object is freed; at this point, the identifier may be reused.
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.07.2015, 18:06
Помогаю со студенческими работами здесь

Как понять, что дочернее приложение - снято?
Извините, решил описать проблему в файле - так накляднее (запускаем "Запускаемый файл").

Вывести позиц Коды символа нажатой клавиши, если не было взаимодействия с мышью, а если было - то не выводить
Вторая: вывести позиц. Коды символа нажатой клавиши, если не было взаимодействия с мышью, а если было - то не выводит. не знаю от слова...

Приложение падает, если было запущено при автозапуске системы
Подскажите я добавил программу в автозагрузку перезагружаю пк она запускается и тут же вырубается А если ее запускать из папки той где...

Сообщение "Восстановление системы не было успешно завершено"
Ребят всем привет.При сбросе windows 7,выдает такое сообщение.Восстановление системы не было успешно завершено. Системные файлы и параметры...

Как сделать прозрачным окно, если оно - дочернее
Всем еще раз привет :) На этот раз позарез нужна прозрачная форма! Пере искал много чего... Но почти все полагается на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru