네임드 파이프 예제

이전 리눅스 시스템에서 명명 된 파이프는 일반적으로 /etc 디렉토리에 있는 mknod 프로그램에 의해 만들어집니다. 더 현대적인 시스템에서 mkfifo는 표준 유틸리티입니다. mkfifo 프로그램은 하나 이상의 파일 이름을 이 작업에 대한 인수로 가져와 해당 이름으로 파이프를 만듭니다. 예를 들어 pipe1이라는 이름으로 명명된 파이프를 만들려면 파이프를 두 개 사용하지 않고 많은 가져오기의 bash 스크립트를 작성하기가 어렵습니다. 반면에 명명된 파이프는 훨씬 드뭅니다. 명명된 파이프는 중간 임시 파일을 사용하지 않고 한 응용 프로그램에서 다른 응용 프로그램으로 정보를 전송하는 데 사용할 수 있습니다. 예를 들어 gzip의 출력을 명명된 파이프에 파이프할 수 있습니다. 위에 표시된 대로 파이프를 만들었다고 가정합니다. 하나의 가상 콘솔1에서 유형: 가장 왼쪽 열의 p는 fifo1이 파이프임을 나타냅니다. 사용 권한 비트의 나머지 는 일반 파일처럼 파이프를 읽거나 쓸 수 있는 사람을 제어합니다. 현대 LS가 있는 시스템에서는 | 파일 이름 끝에있는 문자는 또 다른 단서이며, 색상 옵션이 활성화 된 리눅스 시스템에서 fifo | 은 기본적으로 빨간색으로 인쇄됩니다. 다음 셸 스크립트는 파이프에서 읽습니다. 파이프가 존재하지 않는 경우 먼저 파이프를 작성한 다음 “종료”가 표시 될 때까지 루프에서 읽습니다: 다음 예제에서는 명명된 파이프를 열고 파이프 핸들을 메시지 읽기 모드로 설정하고 WriteFile 함수를 사용하여 서버에 요청을 보내는 파이프 클라이언트를 보여 줍니다.

및 ReadFile 함수를 사용하여 서버의 회신을 읽습니다. 이 파이프 클라이언트는 이 항목의 맨 아래에 나열된 메시지 유형 서버와 함께 사용할 수 있습니다. 그러나 바이트 형식 서버에서는 SetNamedPipeHandleState를 호출하여 메시지 읽기 모드로 변경하면 이 파이프 클라이언트가 실패합니다. 클라이언트가 메시지 읽기 모드에서 파이프에서 읽기 때문에 ReadFile 작업이 부분 메시지를 읽은 후 0을 반환할 수 있습니다. 이 문제는 메시지가 읽기 버퍼보다 클 때 발생합니다. 이 경우 GetLastError 는 ERROR_MORE_DATA를 반환하며 클라이언트는 ReadFile에 대한 추가 호출을 사용하여 메시지의 나머지 부분을 읽을 수 있습니다. 명명된 파이프의 작동 방식을 확인하는 또 다른 방법은 쏟아지는 부분을 백그라운드로 배치하여 두 작업(데이터를 파이프에 붓고 다른 쪽 끝에서 검색)을 수행하는 것입니다. 컴퓨팅에서 명명된 파이프(해당 동작에 대한 FIFO라고도 함)는 유닉스 및 유닉스와 같은 시스템의 기존 파이프 개념을 확장하는 것이며, 프로세스 간 통신(IPC)의 방법 중 하나입니다. 개념은 또한 OS/2 와 마이크로소프트 윈도우에서 발견, 의미 체계는 실질적으로 다르지만. 전통적인 파이프는 “이름 없는” 프로세스만큼만 지속됩니다. 그러나 명명된 파이프는 시스템이 최대인 한 프로세스의 수명 이상으로 지속될 수 있습니다. 더 이상 사용하지 않으면 삭제할 수 있습니다.

일반적으로 명명된 파이프가 파일로 나타나며 일반적으로 IPC에 대해 파이프에 연결하는 프로세스가 있습니다. 명명된 파이프의 또 다른 이름은 FIFO(선착권 우선)입니다. 우리가 특별한 파일의 일종인 명명 된 파이프를 만들 수있는 시스템 호출 (mknod())를 보자. FIFO라는 이름의 파이프 (FIFO)를 사용하는 것은 파일의 일종입니다, 우리는 그것과 관련된 모든 시스템 호출을 사용할 수 있습니다 즉, 열기, 읽기, 쓰기, 닫기. 이미 클라이언트에서 서버로 의 한 메시지, 즉 명명된 파이프 간의 단방향 통신을 보았습니다. 이제 양방향 통신, 즉 클라이언트가 서버로 메시지를 보내고 메시지를 수신하고 동일한 이름의 파이프를 사용하여 클라이언트에 다른 메시지를 다시 보내는 것을 살펴보겠습니다.

This entry was posted in Uncategorized by admin. Bookmark the permalink.

Comments are closed.