시스템 프로그래밍

6-2. 커널 오브젝트와 핸들의 종속관계

CalebHong 2022. 5. 14. 23:51

- 프로세스 A와 A가 생성한 프로세스 B가 있다면 커널 오브젝트도 각각 1개씩 연결되어 있다.

 

프로세스A는 핸들 인덱스 값으로 커널 오브젝트에 접근하게 되는데, 프로세스 A가 프로세스 B의 핸들도 접근할 수 있다.

 

만약 프로세스 B가 소멸되지만 프로세스 A가 여전히 프로세스 B의 핸들을 통해 커널 오브젝트에 접근이 가능하기에 운영체제 영역에서 프로세스 B의 커널 오브젝트를 소멸시키지 않고 유지하게 된다.

 

즉, 운영체제는 커널 오브젝트에 하나라도 접근하는 프로세스가 있다면 커널 오브젝트를 유지시킨다.

 

Q. 메인 함수에서 리턴 값은 어떤 의미가 있는가?

A. 부모 프로세스는 자식 프로세서의 실행 상태를 알아야 하기에 정상적 종료를 했는지에 대한 값을 알아야 하기에 리턴 값은 프로세스의 커널 오브젝트에 종료코드 값으로 저장된다.

 

* GetCurrentProcess() 함수는 핸들의 고유 값을 반환받는 것이 아니라 상수값 '-1' 을 반환한다. -1은 SetCurrentProcessClass 함수가 자기 자신을 의미하는 것으로 간주한다..

 

int _tmain(int argc, TCHAR* argv[])
{
	STARTUPINFO si = { 0,};
    PROCESS_INFORMATION pi;
    si.cb = sizeof(si);
    
    TCHAR command[] = _T("Operation2.exe");
    
    CreateProcess( // Operation 프로세스 생성
    	NULL, command, NULL, NULL, TRUE,
        0, NULL, NULL, &si, &pi
    );
    
    // Operation 프로세스의 우선순위 값을 보통을 설정
    // pi.hProcess를 통해 커널 오브젝트에 접근
    SetPriorityCless(pi.hProcess, NORMAL_PRIORITY_CLASS);
    
    return 0;
}

 - Operation 프로세스의 커널 오브젝트의 UC카운터 값은 2가 된다. 그 이유는 커널 오브젝트에 접근 가능한 프로세스가 2개 즉, 생성한 프로세스와 Operation 프로세스 이기 떄문이다.

 

int _tmain(int argc, TCHAR* argv[])
{
	STARTUPINFO si = { 0,};
    PROCESS_INFORMATION pi;
    si.cb = sizeof(si);
    
    TCHAR command[] = _T("Operation2.exe");
    
    CreateProcess( // Operation 프로세스 생성
    	NULL, command, NULL, NULL, TRUE,
        0, NULL, NULL, &si, &pi
    );
    
    // CloseHandle 함수를 통해 프로세스의 종속성을 끊어 별개의 프로세스로 관리되도록 함
    CloseHandle(pi.hProcess);
    
    return 0;
}

 - CloseHandle 함수는 생성한 해당 프로세스의 커널 오브젝트 UC 카운터 값을 줄여주고 부모 프로세스의 핸들 테이블에서 생성한 프로세스의 핸들 정보를 삭제함으로 종속성을 끊어줌