명명된 파이프 유형, 읽기 및 대기 모드
파이프 서버는 CreateNamedPipe 함수의 dwPipeMode 매개 변수에서 파이프 유형 모드, 읽기 모드 및 대기 모드를 지정합니다. 파이프 클라이언트는 CreateFile 함수를 사용하여 파이프 핸들에 대해 이러한 파이프 모드를 지정할 수 있습니다.
형식 모드
파이프의 형식 모드는 명명된 파이프에 데이터를 쓰는 방법을 결정합니다. 데이터는 명명된 파이프를 통해 바이트 스트림 또는 메시지 스트림으로 전송할 수 있습니다. 파이프 서버는 CreateNamedPipe를 호출하여 명명된 파이프의 instance 만들 때 파이프 유형을 지정합니다. 형식 모드는 파이프의 모든 인스턴스에 대해 동일해야 합니다.
바이트 형식 파이프를 만들려면 PIPE_TYPE_BYTE 지정하거나 기본값을 사용합니다. 데이터는 파이프에 바이트 스트림으로 기록되며 시스템은 다른 쓰기 작업으로 작성된 바이트를 구분하지 않습니다.
메시지 형식 파이프를 만들려면 PIPE_TYPE_MESSAGE 지정합니다. 시스템은 파이프에 대한 각 쓰기 작업에 기록된 바이트를 메시지 단위로 처리합니다. 시스템은 항상 쓰기 모드가 활성화된 것처럼 메시지 유형 파이프에서 쓰기 작업을 수행합니다.
읽기 모드
파이프의 읽기 모드는 명명된 파이프에서 데이터를 읽는 방법을 결정합니다. 파이프 서버는 CreateNamedPipe를 호출할 때 파이프 핸들의 초기 읽기 모드를 지정합니다. 바이트 읽기 모드 또는 메시지 읽기 모드에서 데이터를 읽을 수 있습니다. 바이트 형식 파이프에 대한 핸들은 바이트 읽기 모드에만 있을 수 있습니다. 메시지 형식 파이프에 대한 핸들은 바이트 읽기 또는 메시지 읽기 모드일 수 있습니다. 메시지 형식 파이프의 경우 동일한 파이프 instance 서버 및 클라이언트 핸들에 대해 읽기 모드가 다를 수 있습니다.
바이트 읽기 모드에서 파이프 핸들을 만들려면 PIPE_READMODE_BYTE 지정하거나 기본값을 사용합니다. 데이터는 파이프에서 바이트 스트림으로 읽습니다. 파이프에서 사용 가능한 모든 바이트를 읽거나 지정된 바이트 수를 읽을 때 읽기 작업이 성공적으로 완료됩니다.
메시지 읽기 모드에서 파이프 핸들을 만들려면 PIPE_READMODE_MESSAGE 지정합니다. 데이터는 파이프에서 메시지 스트림으로 읽습니다. 전체 메시지를 읽을 때만 읽기 작업이 성공적으로 완료됩니다. 읽을 지정된 바이트 수가 다음 메시지의 크기보다 작으면 함수는 0을 반환하기 전에 가능한 한 많은 메시지를 읽습니다( GetLastError 함수는 ERROR_MORE_DATA 반환). 다른 읽기 작업을 사용하여 메시지의 나머지 부분을 읽을 수 있습니다.
파이프 클라이언트의 경우 CreateFile 에서 반환된 파이프 핸들은 처음에는 항상 바이트 읽기 모드입니다. 파이프 클라이언트와 파이프 서버 모두 SetNamedPipeHandleState 함수를 사용하여 파이프 핸들의 읽기 모드를 변경할 수 있습니다. 파이프 핸들에는 FILE_WRITE_ATTRIBUTES 액세스 권한이 있어야 합니다.
대기 모드
파이프 핸들의 대기 모드는 ReadFile, WriteFile 및 ConnectNamedPipe 함수가 긴 작업을 처리하는 방법을 결정합니다. 차단 대기 모드에서 함수는 파이프의 다른 쪽 끝에 있는 프로세스가 작업을 완료할 때까지 무기한 대기합니다. 비블로킹 대기 모드에서 함수는 무기한 대기가 필요한 상황에서 즉시 반환됩니다.
ReadFile 작업은 파이프가 비어 있을 때 파이프 핸들의 대기 모드에 의해 영향을 받습니다. 차단 대기 핸들을 사용하면 스레드 쓰기에서 파이프의 다른 쪽 끝으로 데이터를 사용할 수 있게 될 때까지 작업이 성공적으로 완료되지 않습니다. 비블로킹 대기 핸들을 사용하여 함수는 즉시 0을 반환하고 GetLastError 함수는 ERROR_NO_DATA 반환합니다.
WriteFile 작업은 파이프 버퍼에 공간이 부족한 경우 파이프 핸들의 대기 모드에 의해 영향을 받습니다. 차단 대기 핸들을 사용하면 파이프의 다른 쪽 끝에서 읽는 스레드에 의해 버퍼에 충분한 공간이 생성될 때까지 쓰기 작업이 성공할 수 없습니다. 비블로킹 대기 핸들을 사용하면 쓰기 작업은 바이트를 작성하지 않고(메시지 형식 파이프의 경우) 또는 버퍼가 보유하는 바이트 수(바이트 형식 파이프의 경우)를 작성한 후 즉시 0이 아닌 값을 반환합니다.
ConnectNamedPipe 작업은 연결된 클라이언트가 없거나 파이프 instance 연결을 기다리는 경우 파이프 핸들의 대기 모드에 의해 영향을 받습니다. 차단 대기 핸들을 사용하면 파이프 클라이언트가 CreateFile 또는 CallNamedPipe 함수를 호출하여 파이프 instance 연결할 때까지 연결 작업이 성공하지 못합니다. 비블로킹 대기 핸들을 사용하면 연결 작업이 즉시 0을 반환하고 GetLastError 함수는 ERROR_PIPE_LISTENING 반환합니다.
기본적으로 CreateNamedPipe 또는 CreateFile 함수에서 반환된 모든 명명된 파이프 핸들은 차단 대기 모드를 사용하도록 설정하여 만들어집니다. 비블로킹 대기 모드에서 파이프를 만들기 위해 파이프 서버는 CreateNamedPipe를 호출할 때 PIPE_NOWAIT 지정합니다.
파이프 클라이언트와 파이프 서버 모두 SetNamedPipeHandleState 함수에 대한 호출에서 PIPE_WAIT 또는 PIPE_NOWAIT 지정하여 파이프 핸들의 대기 모드를 변경할 수 있습니다.
참고
비 차단 대기 모드는 Microsoft LAN Manager 버전 2.0과의 호환성을 위해 지원됩니다. 이 모드는 명명된 파이프와 겹치는 입력 및 출력(I/O)을 달성하는 데 사용하면 안 됩니다. 겹치는 I/O를 대신 사용해야 합니다. 함수가 반환된 후 백그라운드에서 시간이 많이 걸리는 작업을 실행할 수 있기 때문입니다. 겹치는 I/O에 대한 자세한 내용은 동기 및 겹치는 입력 및 출력을 참조하세요.