PROCESS_INFORMATION 구조체

3355 단어 라인프로세스
typedef struct _PROCESS_INFORMATION { 
    HANDLE hProcess; //  
    HANDLE hThread;        // 。 
    DWORD dwProcessId;    // ID  
    DWORD dwThreadId;      // ID  
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;

호출
Createprocess
() 함수가 있으면 자동으로 구조가 채워집니다.
앞에서 말한 바와 같이, 새 프로세스를 만들면 시스템이 하나의 프로세스 핵 대상과 하나의 라인 핵 대상을 만들 수 있다.프로세스를 만들 때 시스템은 모든 대상에 초기 사용 계수 값 1을 부여합니다.그리고createProcess가 되돌아오기 전에 이 함수는 프로세스 대상과 루틴 대상을 열고 모든 대상의 프로세스와 관련된 핸들을 PROCESS 에 넣습니다INFORMATION 구조의
hProcess

hThread 
멤버 중.CreateProcess가 내부에서 이러한 객체를 열면 각 객체의 사용 개수가 2로 변경됩니다.
이것은 시스템이 프로세스 대상을 방출하기 전에 이 프로세스는 실행을 중지해야 하며, 계수를 1로 줄여야 하며, 부모 프로세스가 호출되어야 한다는 것을 의미한다
CloseHandle
(다시 사용 계수를 1씩 줄여 0으로 변경합니다.)마찬가지로, 스레드 대상을 방출하려면 이 스레드는 운행을 중지해야 하고, 부모 프로세스는 스레드 대상의 핸들을 닫아야 한다. (스레드 대상을 방출하는 것에 대한 상세한 설명은 본 장 뒤의 '하위 프로세스' 부분을 참고하십시오.)
프로그램이 실행될 때 자원을 누설하지 않도록 하위 프로세스와 주 라인의 핸들을 닫아야 합니다.물론 프로세스가 종료될 때 시스템은 자동으로 이러한 누설 현상을 제거하지만, 프로세스가 하위 프로세스와 프로세스의 라인에 접근할 필요가 없을 때, 비교적 잘 작성된 소프트웨어는 이 핸들을 현저하게 닫을 수 있다. (호출을 통해
CloseHandle
함수로 닫기).이 문구들을 닫을 수 없는 것은 개발자들이 가장 자주 범하는 오류 중의 하나이다.
일부 원인으로 인해, 많은 개발자들은 프로세스나 라인을 닫는 핸들이 시스템에 프로세스나 라인을 취소하게 할 것이라고 생각한다.실제 상황은 결코 이와 같지 않다.커서를 닫는 것은 프로세스나 라인의 통계 데이터에 관심이 없다는 것을 시스템에 알리는 것일 뿐입니다.프로세스나 루틴이 스스로 실행을 중지할 때까지 계속 실행될 것입니다.
프로세스 커널 객체가 생성되면 시스템은 해당 객체에 고유한 ID 번호를 부여하며 시스템의 다른 프로세스 커널 객체에는 동일한 ID 번호를 사용할 수 없습니다.스레드 내 핵 대상의 경우도 마찬가지다.스레드 커널 객체가 생성되면 해당 객체에 고유한 시스템 범위 I D 번호가 부여됩니다.프로세스 I D와 스레드 I D는 같은 번호 풀을 공유합니다.이것은 프로세스와 스레드가 같은 I D를 가질 수 없다는 것을 의미한다.또한 객체에는 0이 해당 I D로 지정되지 않습니다.에서
CreateProcess
되돌리기 전에 이 I D로 채워야 합니다
PROCESS_INFORMATION
구조적
dwProcessId

dwThreadId
멤버 중.I D는 시스템의 프로세스와 스레드를 아주 쉽게 식별할 수 있게 한다.일부 유틸리티 (예: Task Manager) 는 ID 에 가장 많이 사용되지만, 효율이 높은 애플리케이션은 거의 사용되지 않습니다.이 때문에 대부분의 응용 프로그램은 ID를 완전히 무시합니다.
프로그램이 ID를 사용하여 프로세스와 스레드를 추적하는 경우 시스템이 프로세스 ID와 스레드 ID를 즉시 재사용할 수 있음을 알아야 합니다.예를 들어, 프로세스가 생성되면 프로세스의 객체가 지정되고 ID 값 122가 부여됩니다.새 프로세스 객체를 작성한 경우 동일한 I D가 부여되지 않습니다.그러나 첫 번째 프로세스 객체가 해제되면 작성된 다음 프로세스 객체에 122를 부여할 수 있습니다.이 점을 기억하면 부정확한 프로세스 대상이나 루틴 대상을 인용하는 코드를 작성하는 것을 피할 수 있다.프로세스 I D를 가져오는 것은 매우 쉽고, 이 I D를 저장하는 것도 어렵지 않지만, 다음에 이 I D가 표시한 프로세스가 풀렸고, 새 프로세스가 만들어졌으며, 같은 I D가 부여되었다는 것을 알아야 한다.저장된 프로세스 I D를 사용할 경우 최종 작업은 원래 I D를 받은 프로세스가 아니라 새 프로세스입니다.
때때로 실행 중인 프로그램이 부모 프로세스를 확인하려고 합니다.우선 하위 프로세스를 생성할 때만 프로세스 간의 부자 관계가 존재한다는 것을 알아야 한다.Windows는 하위 프로세스에서 코드를 실행하기 전에 모/자 관계를 고려하지 않습니다.이전 Windows 버전에서는 프로세스가 상위 프로세스를 질의하도록 하는 함수를 제공하지 않습니다.지금,
ToolHelp 
함수 통과
PROCESSENTRY32
구조는 이런 조회를 가능하게 한다.이 구조에는th32ParentProcess I D 구성원이 있는데 문서의 설명에 따라 프로세스의 부모 프로세스의 I D를 되돌려줍니다.
시스템은 각 프로세스의 부모 프로세스의 I D를 기억할 수 없지만, I D는 즉시 재사용되기 때문에 부모 프로세스의 I D를 얻을 때까지 기다리면 시스템에서 완전히 다른 프로세스를 식별할 수 있습니다.부모 프로세스가 종료되었을 수도 있습니다.어플리케이션이 작성자와 통신하려면 I D를 사용하지 않는 것이 좋습니다.내부 핵 대상과 창 핸들 등 지속성이 좋은 메커니즘을 정의해야 한다.
프로세스 I D 또는 스레드 I D가 재사용되지 않도록 하려면 프로세스나 스레드의 커널 객체가 취소되지 않도록 하는 유일한 방법이 있습니다.새 프로세스나 루틴을 만들었을 때, 이 대상의 핸들을 닫지 않으면, 프로세스 대상이 취소되지 않도록 보장할 수 있습니다.프로그램이 이 I D를 사용하지 않으면 CloseHandle을 호출하면 커널 대상을 방출할 수 있습니다. 이 때 프로세스 I D를 사용하거나 의존하는 것은 더 이상 안전하지 않습니다.하위 프로세스를 사용하면 부모 프로세스나 부모 프로세스의 유효성을 보장할 수 없습니다. 부모 프로세스가 자신의 프로세스 대상이나 프로세스 대상의 핸들을 복사하고, 하위 프로세스가 이 핸들을 계승하지 않으면.
전재:http://blog.csdn.net/akof1314/article/details/5471768

좋은 웹페이지 즐겨찾기