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

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

15.07.2015, 13:13. Показов 1394. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru