저는 Unix 관리자들의 인터뷰 질문을 검토하던 중 "Named Pipes"라는 주제를 발견했습니다.
나는 이 주제를 어느 정도 이해할 수 있었습니다.명명된 파이프||FIFO
하지만 아직도 이런 특정 유형의 파이프를 언제 사용해야 하는지에 대한 지식이 부족한 것 같습니다. 이름 없는 파이프가 작동하지 않는 특별한 경우가 있습니까?
답변1
명명된 파이프(fifo) 에는 내가 생각할 수 있는 네 가지 또는 세 가지 장점이 있습니다.
- 읽기/쓰기 프로세스를 동시에 시작할 필요는 없습니다.
- 여러 명의 리더/라이터를 가질 수 있습니다.공통 조상이 필요하지 않습니다
- 파일로서 소유권과 권한을 제어할 수 있습니다.
양방향의 이름 없는 파이프입니다.가능한단방향입니다**)
|
단방향 표준 쉘 파이프를 고려하면 다중 쉘(ksh
,zsh
및bash
)도 제공됩니다.공동 프로세스양방향 통신을 허용합니다. POSIX는 파이프를 반이중(즉, 각 끝은 읽기 또는 쓰기만 가능)으로 처리하고, 시스템pipe()
호출은 두 개의 파일 핸들을 반환하며, 한 파일 핸들은 읽기 전용으로, 다른 핸들은 쓰기 전용으로 처리할 수 있습니다. 일부(BSD) 시스템은 동시 읽기 및 쓰기를 지원하지만(POSIX는 이를 금지하지 않음) 다른 시스템에서는 각 방향에 하나씩 두 개의 파이프가 필요합니다.pipe()
귀하 의popen()
매뉴얼 페이지를 확인하십시오popen2()
. 방향성은 파이프 이름이 지정되었는지 여부에 따라 달라지지 않을 수 있지만 Linux 2.6에서는 그렇습니다.
(업데이트되었습니다. 피드백 감사드립니다.스티븐 차제라스)
따라서 명명되지 않은 파이프를 사용하여 달성할 수 없는 확실한 작업 중 하나는 기존 클라이언트/서버 응용 프로그램입니다.
단방향 파이프에 대한 위의 마지막(적중) 지점은 Linux, POSIX와 관련이 있습니다(참조:popen()
)는 파이프만 있으면 된다는 의미입니다.읽을 수 있는또는쓰기 가능, 존재하다리눅스는 단방향이다. 바라보다Linux 커널에 대해 알아보기(3판, O'Reilly) Linux 관련 세부 사항을 알아보세요(p787). 다른 운영 체제에서는 양방향(이름이 지정되지 않음) 파이프를 제공합니다.
예를 들어 Nagios는 fifo를명령 파일. 다양한 외부 프로세스(CGI 스크립트, 외부 검사, NRPE 등)는 이 fifo에 명령/업데이트를 작성하며 이는 지속적인 Nagios 프로세스에 의해 처리됩니다.
명명된 파이프 기능은 TCP 연결과 다르지 않지만 중요한 차이점이 있습니다. fifo에는 영구 파일 시스템 이름이 있으므로 판독기가 없어도 쓸 수 있습니다. 쓰기는 차단되지만(비동기 또는 비차단 I/O 없음) 수신자가 존재하지 않으면 차단되지 않습니다. 이후 데이터는 손실됩니다. 부팅(또는 재부팅).
참고로 다음도 참조하세요.유닉스 도메인 소켓, 그리고 대답이 Stackoverflow 질문주요 내용을 요약한 것입니다산업용 컴퓨터방법 및이것에 대해 이야기popen()
답변2
이름이 없거나 익명인 파이프는 부모-자식 관계를 통해 또는 파이프를 제공하는 공통 부모(예: 셸)의 자식으로 관련된 여러 프로세스 간의 일대일, 단방향 프로세스 간 통신 수단을 제공합니다. 프로세스. 프로세스는 연관적이므로 파일 설명자와 파이프의 연관은 암시적일 수 있으며 프로세스 외부 이름을 가진 객체가 필요하지 않습니다. 명명되지 않은 파이프는 이를 사용하는 프로세스가 파이프에 대한 열린 파일 설명자를 유지하는 경우에만 존재합니다. 프로세스가 종료되고 운영 체제가 프로세스와 관련된 모든 파일 설명자를 닫으면 명명되지 않은 파이프도 닫힙니다.
명명된 파이프는 실제로 FIFO입니다. 이는 파일 시스템의 노드로 표시되는 영구 객체입니다. 명명된 파이프는 반드시 관련되지도 않고 동시에 존재할 필요도 없는 하나 이상의 프로세스 간에 다대다 양방향 통신을 제공합니다. 파이프의 파일 이름은 프로세스 간 통신을 위한 주소 또는 계약 역할을 합니다. 한 프로세스만 명명된 파이프에 데이터를 쓰고 다른 프로세스가 명명된 파이프에서 데이터를 읽는 경우 명명된 파이프는 관련된 두 프로세스 간의 명명되지 않은 파이프와 동일한 방식으로 동작합니다.
따라서 짧은 대답은 동시에 존재하지 않을 수 있는 관련 없는 프로세스 간에 통신하려면 명명된 파이프가 필요하다는 것입니다.
답변3
명명된 파이프에는 또 다른 장점이 있습니다. 이를 사용할 수 있습니다.다양한 시스템에 걸쳐. 실시간으로 통신하기 위해 서로 다른 시스템에서 실행되는 두 프로세스를 원한다고 가정합니다. 그런 다음 둘 사이에 폴더를 공유하고 FIFO를 해당 폴더에 넣으면 됩니다. 이는 파일을 처리하도록 설계된 애플리케이션을 포트에서 수신 대기하는 서비스로 변환하는 것보다 훨씬 쉽습니다.
답변4
다른 곳에서는 언급되지 않은 한 가지 장점은 파일만 사용할 수 있는 곳에서는 명명된 파이프를 사용할 수 있다는 것입니다.
예를 들어 일부 이메일 클라이언트에는 ~/.signature의 내용을 각 이메일 메시지에 추가하는 기능이 있습니다. .signature가 명령줄 옵션이거나 메일 클라이언트가 .signature가 실행 가능하다는 것을 인식하고 실행할 수 있는 경우 명명된 파이프가 필요하지 않습니다. 그러나 메일 클라이언트가 그다지 복잡하지 않은 경우 .signature라는 명명된 파이프를 만들고 파일을 읽을 때마다 새 서명을 생성하는 응용 프로그램을 실행할 수 있습니다.