![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Gwire |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 216 Регистрация: 7.8.2007 Где: Николаев Репутация: нет Всего: 4 |
Моя программа (далее Parent) создает новые процессы с помощью CreateProcess. Вроде как процессы должны быть дочерными, то-есть принадлежать ветке Parent процесса. Но когда завершается Parent процесс, дочерные продолжают работать.
|
|||
|
||||
| sentry |
|
||||
|
Code Monkey ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 29.1.2007 Где: Москва Репутация: 1 Всего: 10 |
Так и есть на самом деле. Дочерний процесс смотрит на своего родителя только один раз - во время создания. Дальше он эту информацию не обновляет и ему все равно - есть родитель или нет.
Им важен только родитель и ничего более. В процессах хранится информация только о родителе. Простой пример. Запускаем ProcessExplorer. Дальше выполнить->cmd. Видим, что сmd - дочерний процесс Explorer'a. Далее из cmd делаем mspaint. Видим, что mspaint - дочерний процесс cmd. Закрываем cmd (родителя mspaint). И что видим? Поскольку хранится информация только о родителе, mspaint теперь не является дочерним ни для одного процесса в системе. Вот такие пироги Добавлено через 8 минут и 38 секунд А завершать процессы можно по их хэндлу, например, при закрытии формы... Добавлено через 12 минут и 43 секунды TerminateProcess, а потом CloseHandle... |
||||
|
|||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Для таких целей существует CreateJobObject и прочие процедуры работы с заданиями.
Подробней - смотри в книге Рихтера (глава 5 - задания) или в MSDN. |
|||
|
||||
| Gwire |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 216 Регистрация: 7.8.2007 Где: Николаев Репутация: нет Всего: 4 |
Насколько я знаю OS-ы то процесс не имеещий родителя только один.Это процесс запущенный при загрузке OS. В Unix он називается Init в Windows - System.В Unix при завершении Parent процесса дочерные, по умолчанию, тоже уничтожаются. А вот в Windows с этим что-то передумано.В Unix чтобы дочерные процессы не завершались при завершении Parent процесса им нужно указать нового родителя который заведомо существует, а именно, нулевой процесс Init. А то что какой то процесс может "является дочерним ни для одного процесса в системе" - заблуждение. Процесс который не имеет родителя не может взаемодействует с системой - система о нем не знает. |
|||
|
||||
| sentry |
|
||||||||
|
Code Monkey ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 29.1.2007 Где: Москва Репутация: 1 Всего: 10 |
ProcessExplorer показывает после запуска два процесса, не имеющих родителей - это System Idle Process (а не System, который является как раз дочерним), и Explorer.EXE.
Ничего подобного. Ты бы сделал то, что я описал выше, и убедился. Лично у меня нет никаких оснований для недоверия Руссиновичу
Управление процессами осуществляется отнюдь не родительскими и выше по иерархии. Это делает планировщик Windows. Почему он не должен знать о процессе? Есть же ненулевой хэндл, значит, есть и процесс.
Да, что-то я забыл, что таким способом несколько процессов можно объединить в группу, стыд и позор |
||||||||
|
|||||||||
| Gwire |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 216 Регистрация: 7.8.2007 Где: Николаев Репутация: нет Всего: 4 |
Насчет System я не был уверен, что он нулевой. Руссинович описывает только систему Windows или принцип всех ОС? Если он описывает все ОС, то насчет Unix, Linux, FreeBSD, OpenBSD и других операционных систем семейства Unix он ошибся точно. А на счет Windows, насколько я понял из лекций по ОС-ам, то она не очень отличается от других ОС в плане архитектуры построения вычислительных процессов. А вообще... Я спрашивал, что надо писать в CreateProcess( <здесь> ) чтобы, если мою программу убивают, скажем из taskmgr.exe, то убивают все дерево процессов. DEBUG_ONLY_THIS_PROCESS - создает что похожее, но процесс не визуализируется, хотя в taskmgr.exe виден. Может есть другой(ие) способ(ы) решения этой задачи? А CreateJobObject - ни где не нашел. "С чем его едят?" В какой модуле-pas или библиотеке-dll ее искать. Если в dll - какие параметры вызова. |
|||
|
||||
| sentry |
|
|||
|
Code Monkey ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 29.1.2007 Где: Москва Репутация: 1 Всего: 10 |
||||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Почитай у Рихтера http://www.delphilab.ru/content/view/18/46/
|
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |