유닉스 관리자가 요청한 일련의 인터뷰 질문을 검토하고있었습니다. "named pipe"라는 주제를 찾았습니다.
나는 주제를 봤다; 어느 정도까지 나는 그것을 이해할 수 있었다 :- 명명 된 파이프 || 선입 선출
그러나 여전히이 특정 유형의 파이프를 언제 사용 해야하는지에 대한 지식이 부족하다고 생각합니다. 명명되지 않은 파이프가 작동하지 않는 특별한 상황이 있습니까?
유닉스 관리자가 요청한 일련의 인터뷰 질문을 검토하고있었습니다. "named pipe"라는 주제를 찾았습니다.
나는 주제를 봤다; 어느 정도까지 나는 그것을 이해할 수 있었다 :- 명명 된 파이프 || 선입 선출
그러나 여전히이 특정 유형의 파이프를 언제 사용 해야하는지에 대한 지식이 부족하다고 생각합니다. 명명되지 않은 파이프가 작동하지 않는 특별한 상황이 있습니까?
답변:
명명 된 파이프 (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()
이름이 없거나 익명 인 파이프는 상위-하위 관계 또는 셸과 같이 파이프를 제공하는 공통 상위의 하위가되는 다른 프로세스간에 일대일, 단방향 프로세스 간 통신 수단을 제공합니다. 방법. 프로세스가 관련되어 있으므로 파일 디스크립터와 파이프의 연관은 내재적 일 수 있으며 프로세스 외부에 이름이있는 오브젝트가 필요하지 않습니다. 명명되지 않은 파이프는 파이프를 사용하는 프로세스가 열린 파일 디스크립터를 파이프에 유지하는 한에만 존재합니다. 프로세스가 종료되고 OS가 프로세스와 연관된 모든 파일 디스크립터를 닫으면 이름없는 파이프가 닫힙니다.
명명 된 파이프는 실제로 FIFO입니다. 이들은 파일 시스템의 노드로 표시되는 영구 객체입니다. 명명 된 파이프는 반드시 관련이없고 동시에 존재할 필요가없는 하나 이상의 프로세스간에 다 대다 양방향 통신을 제공합니다. 파이프의 파일 이름은 통신 프로세스 간의 주소 또는 계약 역할을합니다. 하나의 프로세스 만 명명 된 파이프에 쓰고 다른 프로세스가 명명 된 파이프에서 읽는 경우 명명 된 파이프는 두 관련 프로세스 사이의 명명되지 않은 파이프와 같은 방식으로 작동합니다.
따라서 짧은 대답은 동시에 존재하지 않을 수있는 관련되지 않은 프로세스 간의 통신을 위해 명명 된 파이프가 필요하다는 것입니다.
/run
리눅스 데스크탑 시스템 을 살펴보면 아마 fifos와 유닉스 소켓이라는 두 가지를 발견 할 것입니다. IPC 형식입니다 .
다른 곳에서는 언급되지 않은 장점 중 하나는 파일 만 수행 할 장소에서 명명 된 파이프를 사용할 수 있다는 것입니다.
예를 들어 일부 전자 메일 클라이언트에는 ~ / .signature의 내용을 모든 메일 메시지에 추가하는 기능이 있습니다. .signature가 명령 행 옵션이거나 메일 클라이언트가 .signature가 실행 가능하다는 것을 인식하고이를 실행할 수 있으면 이름 지정된 파이프가 필요하지 않습니다. 그러나 메일 클라이언트가 그렇게 정교하지 않으면 .signature라는 이름의 파이프를 만들고 파일을 읽을 때마다 새 서명을 생성하는 응용 프로그램을 실행할 수 있습니다.