Освободите ресурсы после завершения процесса

Вот простое предложение: сравните sys.path в обоих случаях и посмотрите на различия. Ваше ядро ​​ipython в jupyter, вероятно, ищет в других каталогах, чем в обычном процессе python.

6
задан Sam 31 July 2014 в 20:58
поделиться

4 ответа

Действительно нет ничего, что можно сделать, если процесс уничтожается. По определению уничтожение процесса состоит просто в том что - уничтожение его. Процесс не получает возможность выполнить любой код. Это очень "дизайном".

Предположите, что Вы могли зарегистрировать стандартную программу, которую назвали, когда Ваш процесс был уничтожен пользователем (или другим процессом). Что это сделало бы? Все другие потоки в Вашем процессе были бы в неопределенном состоянии, Как Вы будете синхронизироваться с ними? Помните, идея состоит в том, что процесс должен быть уничтожен.

Другой сценарий еще более жесток: Ваш код мягок и пытается сделать правильную вещь - например, вымыться и быть хорошим системным гражданином. Некоторый код не. Вообразите то, чем благом для вредоносного автора это было бы, если бы ОС позволила коду быть выполненным для процесса, который уничтожался. Это было бы достаточно плохо для злонамеренных процессов, которые работали со стандартными полномочиями пользователя, и абсолютно ужасные для любого выполнения с административными привилегиями.

Очень важный завершает, и структурированная обработка исключений не решит эту основную проблему.

НА позитивном аспекте ОС освободит все ресурсы, которые это знает о том, когда Ваш процесс уничтожается, а именно, память и объекты ядра. Они не протекут. Но проводник не знает о Вашем процессе, таким образом, он не может вымыться для него.

Один способ решить это состоял бы в том, чтобы иметь процесс контроля, который отслеживает Ваши другие процессы, указывают, и моется для него. Вы могли сделать это с простым процессом, или с сервисом. Вы могли бы также рассмотреть некоторое расширение оболочки, которое имело его собственный поток, который сделал то же самое.

8
ответ дан 8 December 2019 в 18:42
поделиться

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

Ни критические финализаторы, ни обычные финализаторы, ни блоки попытки/наконец и конечно не простые объекты, которые реализуют IDisposable может заставить код выполняться в этом сценарии. Даже события отсоединения DLL не будут вызваны от завершения процесса через TerminateProcess.

Лучшее, которое можно сделать, должно использовать сторожевой процесс, который контролирует исходный процесс и выполняет соответствующий код, когда исходный процесс завершается.

4
ответ дан 8 December 2019 в 18:42
поделиться

Теоретически O/S должен освободить ресурсы после того, как процесс будет уничтожен. О каком ресурсе Вы думаете в особенности?


Править:

Хорошо, это довольно хитро для объяснения. Я пользуюсь библиотекой, которая переносит некоторые функции ОС для управления некоторыми Расширениями Shell. Когда приложение закрывается, не называя явно соответствующие методы, все замораживания проводника, и я должен перезапустить его.

Любой неуправляемый DLL (согласно документации) предположен быть вызванным с a DLL_PROCESS_DETACH событие; однако, это DLL_PROCESS_DETACH событие не называют, когда процесс завершается через TerminateProcess API.

Поиск с помощью Google для этих условий поднял Старую Новую Вещь: Почему Вы не можете захватить TerminateProcess? который говорит, "После того как Вы уничтожаете с TerminateProcess, больше кода непривилегированного режима не будет работать в том процессе. Это пошло".

Поскольку все, с чем Вы пытаетесь работать (т.е..NET, Проводник, Shell, COM) происходит в непривилегированном режиме, я думаю, что ответ - то, что нет никакого способа сделать то, что Вы хотите.

Вместо этого возможно, существует иначе: например, путем добавления кода к расширениям Shell так, чтобы они поняли, является ли процесс аварийным завершением.

1
ответ дан 8 December 2019 в 18:42
поделиться

Вы могли попытаться перенести свой целый процесс в оператор попытки/наконец (Вы вставляете материал освобождения наконец пункт), но в некоторых случаях даже, который не будет достаточно.

На самом деле я думаю, что Вы могли запустить фоновый поток от своего процесса, чтобы сделать весь материал и Поток. Соединение () с Вашим основным потоком так, чтобы, если что-то идет не так, как надо в дочернем потоке, основной поток все еще смог разобраться в вещах. Конечно, это не будет работать, если целый процесс будет завершен по некоторым причинам.

Вы могли также запустить дочерний процесс и обработку вызовов. WaitForExit (), но я не уверен, могла ли Ваша связанная с оболочкой вещь работать с подходом мультипроцесса.

0
ответ дан 8 December 2019 в 18:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: