12.프로세스 환경 변수

프로세스 환경 변수

 

프로세스별로 메모리 블록이 있다.

 

부모프로세스는 자신의 환경변수를 자식프로세스에게 상속시켜줄수 있다.

 

 

 

 

 

 

 

핸들 테이블 생성 순서

 

프로세스가 메일 슬롯을 생성하면 메일슬롯의 정보가 들어있는 커널오브젝트가 생성이 된다. os는 메일 슬롯 커널 오브젝트의 핸들값과 주소값을 프로세스의 핸들 테이블에 넘겨준다.

 

 

 

부모프로세스의 핸들테이블의 정보가 자식 프로세스에게 상속가능하다. 

이때, 자식 프로세스에게 상속이 될려면, 핸들의 상속여부가 Y여야 한다.

 

 

 

 

핸들의 상속여부 Y 예제

 

 

핸들의 상속과 UC

 

부모의 핸들값을 자식에게 상속하고, 자식이 상속 받으면 부모 프로세스의 핸들 커널 오브젝트의 UC는 1씩 증가한다.

 

 

예제

 

0x1700번지에 메일슬롯을 연결하기 위한 커넥터 커널 오브젝트가 생성이 되었고,

이 핸들값을 이용해서 Receiver 프로세스에게 데이터를 전달한다.

 

이 핸들값이 자식에게도 상속되었기 때문에 자식 프로세스는 이 부모의 MailSender 핸들 테이블의 핸들 값을 이용해서 

Reciever 프로세스에게 값을 전달 할 수 있다.

 

 

Pseudo 핸들과 핸들의 중복

 

자식 프로세스의 핸들 테이블에 부모 프로세스의 핸들 정보를 등록시키려는 의도는 무엇인가?

 

자식프로세스가 부모 프로세스의 핸들 정보를 알고 있으면 부모 프로세스가 종료되는 시점을 알 수 있고,

 

그에 따른 처리를 할 수 있기 때문이다. 

 

문제는 부모 프로세스 A가 생성될 때 프로세스 A의 커널 오브젝트가 생성이 되고 이 커널오브젝트의 핸들 값은

프로세스 A에 등록이 되지 않는다. 이 프로세스 A의 핸들 값을 알고 싶으면 시스템 콜 함수를 이용해서 os 에서

정해놓은 상수값 -1을 리턴되는것을 확인하는 것 뿐이다. 이 부분을 가짜 핸들값이라고 한다. 

 

그러면 부모 프로세스 A의 핸들 값을 어떻게 진짜로 프로세스 A의 핸들 테이블에 전달 할 수 있을까?

 

참고로 자식 프로세스에게 핸들 값을 상속할려면 부모 자신의 핸들 테이블에 상속할 값이 등록되어 있어야 한다. 

 

이때 사용하는 함수가 DuplicateHandle 함수이다.

 

 

 

 

부모 프로세스의 핸들 값을 자신의 핸들 테이블에 복사하는 함수.

복사가 이루어지면 커널 오브젝트의 UC가 하나 늘어난다. (close 함수 두번 호출필요)

이때 프로세스의 핸들 값은 변경된다.

 

 

 

 

 

파이프 방식의 IPC

 

IPC 별 특성

 

이름이 있다는 것은 컴퓨터 이름을 뜻한다. (각각의 컴퓨터를 구분하기 위한 이름)

 

 

 

 

이름 없는 파이프 예제 (부모 자식 프로세스 간통신) - 단방향

 

 

 

이름이 있는 파이프 모델

 

 

 

참고 

뇌를 자극하는 윈도우즈 시스템 프로그래밍 정리 - 한빛출판네트워크