명명되지 않은 파이프보다 명명 된 파이프를 사용하면 어떤 이점이 있습니까?


51

유닉스 관리자가 요청한 일련의 인터뷰 질문을 검토하고있었습니다. "named pipe"라는 주제를 찾았습니다.

나는 주제를 봤다; 어느 정도까지 나는 그것을 이해할 수 있었다 :- 명명 된 파이프 || 선입 선출

그러나 여전히이 특정 유형의 파이프를 언제 사용 해야하는지에 대한 지식이 부족하다고 생각합니다. 명명되지 않은 파이프가 작동하지 않는 특별한 상황이 있습니까?


기술 포럼의 또 다른 링크 : writeulearn.com/category/inter-process-communicationipc

답변:


39

명명 된 파이프 (fifo)에는 내가 생각할 수 있는 가지 세 가지 장점이 있습니다.

  • 읽기 / 쓰기 과정을 동시에 시작할 필요가 없습니다
  • 공통 조상이 필요하지 않은 여러 독자 / 작가가있을 수 있습니다.
  • 소유권과 권한을 제어 할 수있는 파일
  • 그들은 양방향이며, 명명되지 않은 파이프 단방향 일 수 있습니다 *

    *) 표준 쉘 생각 |단방향 파이프 라인, 여러 쉘 ( ksh, zsh, 및 bash)도 제공 coprocesses 양방향 통신을 할 수 있습니다. POSIX는 파이프를 반이중으로 취급합니다 (즉, 각면에서 읽기 또는 쓰기 만 가능). pipe()시스템 호출은 두 개의 파일 핸들을 반환하며 하나는 읽기 전용으로, 다른 하나는 쓰기 전용으로 취급해야합니다. 일부 (BSD) 시스템은 동시에 읽기와 쓰기를 지원하며 (POSIX에서는 금지하지 않음), 다른 시스템에서는 각 방향에 하나씩 두 개의 파이프가 필요합니다. 귀하의 확인 pipe(), popen()그리고 아마도 popen2()맨 페이지를. 비 방향성은 파이프의 이름 지정 여부에 따라 달라지지 않지만 Linux 2.6에서는 종속적입니다.

( Stephane Chazelas의 피드백 덕분에 업데이트 됨 )

따라서 명명되지 않은 파이프로는 달성 할 수없는 명백한 작업 중 하나는 일반적인 클라이언트 / 서버 응용 프로그램입니다.

단방향 파이프에 대한 위의 마지막 (엄격한) 지점은 Linux와 관련이 있으며 POSIX (참조 popen())는 파이프가 읽기 또는 쓰기가능 하고 Linux에서는 단방향임을 나타 냅니다. 참조 리눅스 커널의 이해 리눅스 관련 자세한 내용은 (3 에드. 오라일리) (p787)를. 다른 OS는 양방향 (이름이없는) 파이프를 제공합니다.

예를 들어 Nagios는 명령 파일에 fifo를 사용 합니다 . 다양한 외부 프로세스 (CGI 스크립트, 외부 검사, NRPE 등)가이 fifo에 명령 / 업데이트를 작성하며 영구 Nagios 프로세스에 의해 처리됩니다.

명명 된 파이프에는 TCP 연결과 다른 기능이 있지만 중요한 차이점이 있습니다. fifo는 영구 파일 시스템 이름을 가지고 있기 때문에 독자가 없을 때에도 쓸 수 있지만, 수신자가 그렇지 않으면 데이터가 손실되지 않지만 쓰기가 차단됩니다 (비동기 또는 비 차단 I / O없이) 시작되었거나 다시 시작 중입니다.

참고로, 또한 참조 유닉스 도메인 소켓 , 그리고에 대한 답 이 유래 질문 주요 요약 IPC 방법을, 그리고 이것 에 대한 이야기popen()


2
명명되지 않은 파이프를 가진 여러 리더 / 라이터가질 수도 있습니다 . 리눅스에서는 파이프가 아닌 것보다 양방향성이 아닙니다. 쓰기 끝과 읽기 끝이 있으며 데이터는 한 방향으로 만 흐릅니다. 쓰기 모드에서 fifo를 열면 쓰기 끝, 읽기 모드, 읽기 끝, rw 모드에서 쓰기 끝을 읽고 쓰기 끝에서 읽습니다. 양방향 파이프 또는 유닉스 도메인 소켓과는 다릅니다. 실제로 각 방향에 두 개의 별도 데이터 흐름이 있습니다.
Stéphane Chazelas

@StephaneChazelas 의견을 보내 주셔서 감사합니다. 답변을보다 구체적으로 업데이트하고 파이프와 방향을 명확히합니다.
mr.spuratic

명명 된 파이프와의 통신에 디스크 IO가 포함됩니까? 아니면 모두 메모리에 있습니까? 이러한 IPC 메커니즘의 성능 범위는 어떻게 결정됩니까?
CMCDragonkai

15

이름이 없거나 익명 인 파이프는 상위-하위 관계 또는 셸과 같이 파이프를 제공하는 공통 상위의 하위가되는 다른 프로세스간에 일대일, 단방향 프로세스 간 통신 수단을 제공합니다. 방법. 프로세스가 관련되어 있으므로 파일 디스크립터와 파이프의 연관은 내재적 일 수 있으며 프로세스 외부에 이름이있는 오브젝트가 필요하지 않습니다. 명명되지 않은 파이프는 파이프를 사용하는 프로세스가 열린 파일 디스크립터를 파이프에 유지하는 한에만 존재합니다. 프로세스가 종료되고 OS가 프로세스와 연관된 모든 파일 디스크립터를 닫으면 이름없는 파이프가 닫힙니다.

명명 된 파이프는 실제로 FIFO입니다. 이들은 파일 시스템의 노드로 표시되는 영구 객체입니다. 명명 된 파이프는 반드시 관련이없고 동시에 존재할 필요가없는 하나 이상의 프로세스간에 다 대다 양방향 통신을 제공합니다. 파이프의 파일 이름은 통신 프로세스 간의 주소 또는 계약 역할을합니다. 하나의 프로세스 만 명명 된 파이프에 쓰고 다른 프로세스가 명명 된 파이프에서 읽는 경우 명명 된 파이프는 두 관련 프로세스 사이의 명명되지 않은 파이프와 같은 방식으로 작동합니다.

따라서 짧은 대답은 동시에 존재하지 않을 수있는 관련되지 않은 프로세스 간의 통신을 위해 명명 된 파이프가 필요하다는 것입니다.


+1 프로세스가 항상 거의 항상 존재한다고 생각합니다 (그렇지 않으면 파이프가 약간 무의미합니다-일반 파일에 물건을 남겨 둘 수도 있습니다). 이들 및 유닉스 도메인 소켓은 예를 들어 명령 줄 등에서 제어 할 수있는 데몬 서비스에서 종종 사용됩니다. /run리눅스 데스크탑 시스템 을 살펴보면 아마 fifos와 유닉스 소켓이라는 두 가지를 발견 할 것입니다. IPC 형식입니다 .
goldilocks

2
@goldilocks : 명명 된 파이프는 일반적으로 통신 프로세스가 수명이 짧고 동시에 존재하지 않는 임베디드 시스템의 프로세스간에 메모리 상주 임시 사서함으로 사용됩니다. 장점은 구현의 단순성 대 공유 메모리 IPC 및 RAM 만 사용한다는 사실입니다. 단점은 부트와 파이프의 바이트 단위 FIFO 특성 간의 비 지속성 대 공유 메모리가있는 구조를 사용할 수 있다는 것입니다.
조나단 벤-아브라함

@jonathan : +1, 의심의 여지가 있습니다 :-왜 우리는 명명 된 파이프를 FIFO라고합니까? 지속성 객체 란 무엇입니까?
Ankit

@Ankit : 어떤 사람들은 FIFO 데이터 구조처럼 동작하기 때문에, 특히 단일 프로세스로 읽고 쓰기 위해 열 때 명명 된 파이프를 FIFO라고합니다. "지속적 개체"란 명명 된 파이프가 파일 시스템 개체와 연결되어 있음을 의미했습니다. 즉, 이름이있는 파일 형식이며 미디어에 저장된 다른 파일과 동일한 지속성을 갖습니다.
Jonathan Ben-Avraham

4

다른 곳에서는 언급되지 않은 장점 중 하나는 파일 만 수행 할 장소에서 명명 된 파이프를 사용할 수 있다는 것입니다.

예를 들어 일부 전자 메일 클라이언트에는 ~ / .signature의 내용을 모든 메일 메시지에 추가하는 기능이 있습니다. .signature가 명령 행 옵션이거나 메일 클라이언트가 .signature가 실행 가능하다는 것을 인식하고이를 실행할 수 있으면 이름 지정된 파이프가 필요하지 않습니다. 그러나 메일 클라이언트가 그렇게 정교하지 않으면 .signature라는 이름의 파이프를 만들고 파일을 읽을 때마다 새 서명을 생성하는 응용 프로그램을 실행할 수 있습니다.


흥미 롭군 그런 응용 프로그램이 있습니까? FIFO가 언제 액세스되는지 확인하려면 커널 수준에서 지켜봐야 할 것 같습니다.
와일드 카드

4

명명 된 파이프의 또 다른 장점이 있습니다 . 다른 시스템에서 사용할 수 있습니다 . 다른 시스템에서 실행중인 두 프로세스의 실시간 통신을 원한다고 가정하십시오. 그런 다음 둘 사이에 폴더를 공유하고 FIFO를 폴더에 넣은 다음 꺼냅니다. 파일에서 작동하도록 설계된 응용 프로그램을 포트에서 수신 대기하는 서비스로 변환하는 것보다 훨씬 쉽습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.