문제

예를 들어 작업 관리자에 의해 프로세스가 죽을 때 자원을 처리 할 수있는 방법은 무엇입니까? 프로세스가 닫히기 전에 함수를 호출하는 방법이 있습니까?

도움이 되었습니까?

해결책

프로세스가 죽으면 할 수있는 일은 없습니다. 정의에 따르면, 과정을 죽이는 것은 그저 그것을 죽이는 것입니다. 프로세스는 코드를 실행할 수있는 기회를 얻지 못합니다. 이것은 매우 "디자인으로"입니다.

사용자 (또는 다른 프로세스)에 의해 프로세스가 사망했을 때 호출 된 루틴을 등록 할 수 있다고 상상해보십시오. 무엇을할까요? 프로세스의 다른 모든 스레드는 불확실한 상태에있을 것입니다. 어떻게 동기화 하시겠습니까? 아이디어는 프로세스를 죽여야한다는 것입니다.

다른 시나리오는 더욱 힘들다. 코드는 양성이며 올바른 일을하려고 노력한다 - 예를 들어 정리하고 좋은 시스템 시민이 되십시오. 일부 코드는 아닙니다. 맬웨어 저자에게 혜택을주는 것이 무엇인지 상상해보십시오. OS가 죽은 프로세스에 대해 OS가 코드를 실행할 수있게했을 것입니다. 표준 사용자 권한으로 실행중인 악의적 인 프로세스에는 충분히 나쁘고 관리 권한을 가진 운영에는 완전히 끔찍합니다.

중요한 확정 및 구조화 된 예외 처리는이 기본 문제를 해결하지 않습니다.

업사이드에서 OS는 프로세스가 죽을 때 알고있는 모든 리소스, 즉 메모리 및 커널 객체를 자유롭게합니다. 그것들은 새지 않을 것입니다. 그러나 탐색기는 프로세스에 대해 알지 못하므로 정리할 수 없습니다.

이를 해결하는 한 가지 방법은 다른 프로세스 상태를 추적하고 정리하는 모니터링 프로세스를 갖는 것입니다. 간단한 프로세스 또는 서비스 로이 작업을 수행 할 수 있습니다. 당신은 또한 같은 일을 한 자체 스레드를 가진 일종의 쉘 확장을 고려할 수도 있습니다.

다른 팁

전화로 종료 될 때 종료시 임의 코드를 실행할 방법이 없습니다. TerminateProcess, 작업 관리자 또는 TSKILL 또는 TASKKILL과 같은 다른 프로세스 유틸리티와 같은.

중요한 최종화기 나 일반 최종화제도 아니고 시도/마침내 블록을 시도하지 않으며, 단순한 객체가 아닙니다. IDisposable 이 시나리오에서 코드를 실행할 수 있습니다. DLL Detach 이벤트조차도 프로세스 종료에서 호출되지 않습니다. TerminateProcess.

최선의 방법은 원래 프로세스를 모니터링하고 원래 프로세스가 종료 될 때 관련 코드를 실행하는 Watchdog 프로세스를 사용하는 것입니다.

이론적으로 O/S는 프로세스가 사망 한 후 자원을 처리해야합니다. 특히 어떤 종류의 자원을 생각하고 있습니까?


편집하다:

좋아, 설명하기가 좀 까다 롭다. 일부 OS 기능을 포장하여 일부 쉘 확장을 관리하는 라이브러리를 사용하고 있습니다. 적절한 방법을 명시 적으로 호출하지 않고 응용 프로그램이 닫히면 모든 탐색기가 얼어 붙어 다시 시작해야합니다.

관리되지 않는 DLL은 (문서에 따라) DLL_PROCESS_DETACH 이벤트; 그러나 이것 DLL_PROCESS_DETACH 프로세스가 종료되면 이벤트가 호출되지 않습니다. TerminateProcess API.

인터넷 검색 이 용어 켜져 오래된 새로운 것 : 왜 TerminateProcess를 트랩 할 수 없습니까?그것은 말한다. "TerminateProcess로 죽이면 해당 프로세스에서 더 이상 사용자 모드 코드가 실행되지 않습니다. 그것은 사라 졌어요."

사용자 모드에서 (IE .NET, Explorer, Shell, COM)와 함께 작업하려는 모든 것이 발생하기 때문에 대답은 원하는대로 할 수있는 방법이 없다는 것입니다.

대신, 다른 방법이있을 수 있습니다. 예를 들어, 쉘 확장에 코드를 추가하여 프로세스가 강화되는지 알 수 있습니다.

시도/마침내 진술서에서 전체 프로세스를 포장 할 수 있지만 (마지막 절에 할당 물건을 넣을 수 있음) 경우에 따라 충분하지 않습니다.

실제로, 나는 당신이 당신의 프로세스에서 배경 스레드를 시작하여 모든 것들과 스레드를 수행 할 수 있다고 생각합니다. 메인 스레드와 함께 모든 것들과 스레드를 수행하여 자식 스레드에서 무언가 잘못되면 기본 스레드가 여전히 올바르게 얻을 수 있습니다. . 물론 전체 프로세스가 어떤 이유로 종료되면 작동하지 않습니다.

하위 프로세스 및 호출 프로세스를 시작할 수도 있지만 waitforexit ()이지만 쉘 관련 항목이 다중 프로세스 접근 방식으로 작동 할 수 있는지 확실하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top