다음을 통해 공유


파이프 핸들 상속

파이프 서버는 다음과 같은 방법으로 핸들을 상속할 수 있는지 여부를 제어합니다.

  • CreatePipe 함수는 SECURITY_ATTRIBUTES 구조를 받습니다. 파이프 서버가 이 구조체의 bInheritHandle 멤버를 TRUE로 설정하면 CreatePipe 에서 만든 핸들을 상속할 수 있습니다.
  • 파이프 서버는 DuplicateHandle 함수를 사용하여 파이프 핸들의 상속을 변경할 수 있습니다. 파이프 서버는 상속 가능한 파이프 핸들 또는 상속할 수 없는 파이프 핸들의 상속 가능한 중복을 만들 수 있습니다.
  • CreateProcess 함수를 사용하면 파이프 서버가 자식 프로세스가 상속 가능한 핸들의 전부 또는 없음을 상속할지 여부를 지정할 수 있습니다.

자식 프로세스가 파이프 핸들을 상속하는 경우 시스템은 프로세스가 파이프에 액세스할 수 있도록 합니다. 그러나 부모 프로세스는 핸들 값을 자식 프로세스에 전달해야 합니다. 부모 프로세스는 일반적으로 다음 단계에 표시된 대로 표준 출력 핸들을 자식 프로세스로 리디렉션하여 이 작업을 수행합니다.

  1. GetStdHandle 함수를 호출하여 현재 표준 출력 핸들을 가져옵니다. 자식 프로세스를 만든 후 원래 표준 출력 핸들을 복원할 수 있도록 이 핸들을 저장합니다.
  2. SetStdHandle 함수를 호출하여 표준 출력 핸들을 파이프에 대한 쓰기 핸들로 설정합니다. 이제 부모 프로세스에서 자식 프로세스를 만들 수 있습니다.
  3. CloseHandle 함수를 호출하여 파이프에 대한 쓰기 핸들을 닫습니다. 자식 프로세스가 쓰기 핸들을 상속하면 부모 프로세스에 더 이상 복사본이 필요하지 않습니다.
  4. SetStdHandle을 호출하여 원래 표준 출력 핸들을 복원합니다.

자식 프로세스는 GetStdHandle 함수를 사용하여 표준 출력 핸들을 가져옵니다. 이 핸들은 이제 파이프의 쓰기 끝에 대한 핸들입니다. 그런 다음 자식 프로세스는 WriteFile 함수를 사용하여 출력을 파이프로 보냅니다. 자식이 파이프를 완료하면 CloseHandle 을 호출하거나 종료하여 파이프 핸들을 닫아야 합니다. 그러면 핸들이 자동으로 닫힙니다.

부모 프로세스는 ReadFile 함수를 사용하여 파이프에서 입력을 받습니다. 데이터는 바이트 스트림으로 익명 파이프에 기록됩니다. 즉, 부모 프로세스와 자식 프로세스가 모두 프로토콜을 사용하여 쓰기 작업이 끝나는 위치를 나타내지 않는 한 파이프에서 읽는 부모 프로세스는 별도의 쓰기 작업으로 작성된 바이트를 구분할 수 없습니다. 파이프에 대한 모든 쓰기 핸들이 닫혀 있으면 ReadFile 함수는 0을 반환합니다. ReadFile을 호출하기 전에 부모 프로세스에서 파이프의 쓰기 끝에 대한 핸들을 닫는 것이 중요합니다. 이 작업을 수행하지 않으면 부모 프로세스에 파이프의 쓰기 끝에 대한 열린 핸들이 있으므로 ReadFile 작업은 0을 반환할 수 없습니다.

표준 입력 핸들을 리디렉션하는 절차는 파이프의 읽기 핸들이 자식의 표준 입력 핸들로 사용된다는 점을 제외하고 표준 출력 핸들을 리디렉션하는 절차와 비슷합니다. 이 경우 부모 프로세스는 자식 프로세스가 파이프의 쓰기 핸들을 상속하지 않도록 해야 합니다. 이 작업을 수행하지 않으면 자식 프로세스에 파이프의 쓰기 끝에 대한 열린 핸들이 있으므로 자식 프로세스에서 수행하는 ReadFile 작업은 0을 반환할 수 없습니다.

익명 파이프를 사용하여 자식 프로세스의 표준 핸들을 리디렉션하는 예제 프로그램은 리디렉션된 입력 및 출력을 사용하여 자식 프로세스 만들기를 참조하세요.