코딩/C and C++

네임드 파이프 (Named-Pipe)

이쿠우우 2020. 10. 4. 13:36
반응형

네임드 파이프 (Named-Pipe)

 

 

네임드 파이프 란?

익명 파이프(Pipe)

통신을 할 프로세스가 명확하게 알 수 있는 경우 사용

자식과 부모 프로세스간 통신의 경우에 사용 가능

 

[단점]

PPID(같은 부모 프로세스)를 가지는 프로세스들 사이에서만 통신이 가능

전혀 모르는 상태의 프로세스들 사이의 통신의 경우 사용

 

 

네임드 파이프 (Named Pipe)

Named Pipe는 Pipe의 단점을 해결한, Pipe의 확장이라고 할 수 있음

이름을 가진 PIPE 를 통해서 프로세스들 간에 단방향 통신을 지원

서로 다른 프로레스들이 PIPE 의 이름만 알면 통신이 가능함

 

[단점]

읽기/쓰기가 동시에 불가능함, read only, write only 만 가능

해당 단점을 해결하기 위해 보통 pipe 하나를 읽기전용, 하나를 쓰기 전용으로 열어서 사용함

 

 

 

IPC 종류

PIPE

Named PIPE

사용 시기

부모 자식 간

단 방향 통신 시

다른 프로세스와

단 방향 통신 시

공유 매개체

파일

파일

통신 단위

Stream

Stream

통신 방향

단 방향

단 방향

 

 

 

 

 

 

네임드 파이프 통신과정

Server (Read)가 하는 작업

1. CreateNamePipe()

파이프를 생성

 

(매개변수 설명)

CreateNamedPipe(

    LPCWSTR lpName,             # 파이프 이름 지정 예) \\\\.\\pipe\\pipename

    DWORD dwOpenMode,      # 3가지 종류의 open mode(flag)가 존재

                                   # PIPE_ACCESS_DUPLEX //읽기 + 쓰기 모드

                                   # PIPE_ACCESS_INBOUND //읽기 (서버입장에서의 읽기)

                                   # PIPE_ACCESS_OUTBOUND //쓰기 (서버입장에서의 쓰기)

    DWORD dwPipeMode,   # 3가지 종류의 Pipe mode(flag)가 존재

                          # PIPE_TYPE_BYTE, PIPE_TYPE_MESSAGE = 데이터 전송 형태 결정(바이너리, 메시지 모드)

                          # PIPE_READMODE_BYTE , PIPE_READMODE_MESSAGE = 데이터 수신 형태 결정(바이너리, 메시지 모드)

                          # PIPE_WAIT, PIPE_NOWAIT = PIPE_WAIT만 쓰입니다.

    DWORD nMaxInstances,         # 생성할 수 있는 최대한의 파이프 갯수. 1~255 까지 허용.

    DWORD nOutBufferSize,         # 파이프 출력 버퍼 사이즈

    DWORD nInbufferSize,           # 파이프 입력 버퍼 사이즈

    DWORD nDefaultTimeOut,      # WaitNamedPipe() 함수에 적용할 시간. 단위 : ms (1/1000초)  

    LPSECURITY_ATTRIBUTES lpSecurityAttributes  # 보안 속성을 가지는 구조체

);

 

 

 

2. ConnectNamePipe()

다른 프로세스들이 파이프 연결 요청을 기다림

 

(매개변수 설명)

BOOL ConnectNamedPipe(

     HANDLE hNamedPipe,          # CreateNamedPipe를 통해 호출된 파이프 핸들 전달

     LPOVERLAPPED lpOverlapped   # 중첩 I/O를 위한 전달 인자.

  );

 

 

 

Client (Writer)가 하는 작업

1. CreateFile()

파일을 생성하는 함수

하지만 IPC 연결 요청을 하는 경우 메일슬롯, 파이프 등 생성하는 중요한 함수

 

(매개변수 설명)

HANDLE CreateFile( 

      LPCTSTR lpFileName,                             # 파일을 생성하거나 open 할 경로

      DWORD dwDesiredAcess,                        # 파일 엑세스 권한 설정 (Flag)

      DWORD dwShareMode,                          # 파일의 공유 모드를 설정 (Flag)

      LPSECURITY_ATTRIBUTES lpSecurity Attribute  # SECURITY_ATTRIBUTES 구조체의 포인터

      DWORD dwCreationDisposition,                # 파일이 해당 위치에 존재하는지에 따른 행동 설정 (Flag)

      DWORD dwFlagsAndAttributes,                 # 생성될 파일의 속성을 지정 (Flag) 예) 읽기전용, 숨김설정, 등등

      HANDLE hTemplateFile                           # GENERIC_READ 엑세스 권한을 가진 템플릿 파일의 유효한 핸들

);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형