명명 된 파이프는 무엇입니까?


답변:


153

Windows 및 POSIX 시스템 모두에서 명명 된 파이프는 동일한 시스템에서 실행되는 프로세스간에 프로세스 간 통신을 수행 할 수있는 방법을 제공합니다. 명명 된 파이프가 제공하는 것은 네트워크 스택과 관련된 성능 저하없이 데이터를 전송하는 방법입니다.

들어오는 요청에 대해 IP 주소 / 포트를 수신하는 서버가있는 것처럼 서버는 요청을 수신 할 수있는 명명 된 파이프를 설정할 수도 있습니다. 두 경우 모두 클라이언트 프로세스 (또는 DB 액세스 라이브러리)는 요청을 보낼 특정 주소 (또는 파이프 이름)를 알아야합니다. 흔히 사용되는 표준 기본값이 존재하는 경우가 많습니다 (HTTP의 포트 80과 마찬가지로 SQL Server는 TCP / IP의 포트 1433을 사용하고 명명 된 파이프의 경우 \\. \ pipe \ sql \ query를 사용합니다).

추가 명명 된 파이프를 설정하면 각각 고유 한 요청 리스너를 가진 여러 DB 서버를 실행할 수 있습니다.

명명 된 파이프의 장점은 일반적으로 훨씬 빠르며 네트워크 스택 리소스를 확보한다는 것입니다.

-BTW, Windows 환경에서는 명명 된 파이프를 원격 시스템으로 전송할 수도 있지만이 경우 명명 된 파이프는 TCP / IP를 통해 전송되므로 성능이 저하됩니다. 로컬 머신 통신에는 명명 된 파이프를 사용하십시오.


1
단점은 무엇입니까?
lindhe

2
@lindhe 네트워크를 통한 자동 조작이 없습니다. 일반적으로 실제로 설정하기가 더 어렵습니다. Unix / Unix 계열 시스템과 다른 Windows 구현. 그들은 시원하지만 성능이 필수가 아니면 귀찮게하지 않을 것입니다.
sudo

43

유닉스와 윈도우는 모두 "명명 된 파이프"라는 것을 가지고 있지만 다르게 동작합니다. 유닉스에서 명명 된 파이프는 일반적으로 단 하나의 독자와 작가가있는 단방향 도로입니다. 작가는 글을 쓰고 독자는 읽습니다.

Windows에서 "명명 된 파이프"라는 것은 TCP 소켓과 유사한 IPC 객체입니다. 두 가지 방식으로 모두 흐를 수 있고 일부 메타 데이터가 있습니다 (다른 쪽에서 해당 자격 증명을 얻을 수 있음).

유닉스 명명 된 파이프는 파일 시스템에서 특수 파일로 나타나며 쉘을 포함한 일반 파일 IO 명령으로 액세스 할 수 있습니다. Windows는 특별한 시스템 호출로 열리지 않아야하며 (그 후에는 보통 win32 핸들과 같이 동작합니다).

더 혼란스러운 Unix에는 "Unix socket"또는 AF_UNIX 소켓이 있는데, 이는 win32 "named pipe"와 유사하지만 양방향으로 작동합니다.


23


FIFO ( Linux Pipes First In First Out) 프로세스 간 통신 메커니즘.

명명되지 않은 파이프
명령 행에서 "|" 두 명령 사이.

명명 된 파이프
FIFO 특수 파일. 일단 생성되면 파이프를 일반 파일 (열기, 닫기, 쓰기, 읽기 등)처럼 사용할 수 있습니다.

명령 행 ( man page ) 에서 "myPipe"라는 이름의 파이프를 작성하려면 다음을 수행 하십시오 .

mkfifo myPipe  

c에서 명명 된 파이프를 만들려면 여기서 "pathname"은 파이프에 원하는 이름이고 "mode"는 파이프에 원하는 권한을 포함합니다 ( 맨 페이지 ).

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);

2
"파이프를 일반 파일처럼 사용할 수 있습니다"– 완전히 사실은 아닙니다. 파이프를 tell()배치하거나 배치 할 수 없습니다 seek().
nyov

19

Wikipedia 에 따르면 :

[...] 기존 파이프는 익명으로 존재하고 프로세스가 실행되는 동안 만 지속되므로 "이름이 지정되지 않았습니다". 명명 된 파이프는 시스템에 영구적이며 프로세스 수명을 넘어 존재하며 더 이상 사용되지 않으면 "연결 해제"되거나 삭제되어야합니다. 프로세스는 일반적으로 IPC (프로세스 간 통신)를 수행하기 위해 명명 된 파이프 (일반적으로 파일로 표시됨)에 연결됩니다.


12

비교

echo "test" | wc

mkdnod apipe p
wc apipe

화장실 때까지 차단

echo "test" > apipe

실행


7

파이프는 응용 프로그램간에 데이터를 스트리밍하는 방법입니다. 리눅스에서는 한 프로세스의 출력을 다른 프로세스로 스트리밍하기 위해 항상 이것을 사용합니다. 대상 앱은 입력 스트림의 출처를 모릅니다. 필요하지 않습니다.

명명 된 파이프는 적극적으로 기존 파이프에 후킹 hoovering 업 데이터를하는 방법이다. 제공자가 어떤 클라이언트가 데이터를 먹을지 알지 못하는 상황을위한 것입니다.


6

이것은 Technet의 exeprt입니다 (따라서 표시된 답변이 명명 된 파이프가 더 빠르다는 이유는 확실하지 않습니다 ??).

명명 된 파이프와 TCP / IP 소켓

빠른 근거리 통신망 (LAN) 환경에서 TCP / IP (Transmission Control Protocol / Internet Protocol) 소켓 및 명명 된 파이프 클라이언트는 성능과 관련하여 비슷합니다. 그러나 TCP / IP 소켓과 Named Pipes 클라이언트의 성능 차이는 WAN (Wide Area Network) 또는 전화 접속 네트워크와 같은 느린 네트워크에서 분명해집니다. 이는 프로세스 간 통신 (IPC) 메커니즘이 피어간에 통신하는 방식이 다르기 때문입니다.

명명 된 파이프의 경우 네트워크 통신은 일반적으로 더 대화식입니다. 피어는 다른 피어가 읽기 명령을 사용하여 요청할 때까지 데이터를 보내지 않습니다. 네트워크 읽기에는 일반적으로 데이터 읽기를 시작하기 전에 파이프 이름이 지정된 파이프 메시지가 포함됩니다. 이들은이 될 수 느린 네트워크에 과도한 네트워크 트래픽이 원인이 매우 비용이 많이 드는 차례로 다른 네트워크 클라이언트에 영향을 미칩니다.

로컬 파이프 또는 네트워크 파이프에 대해 이야기하고 있는지 명확히하는 것도 중요합니다. 서버 응용 프로그램이 SQL Server 인스턴스를 실행하는 컴퓨터에서 로컬로 실행중인 경우 로컬 명명 된 파이프 프로토콜이 옵션입니다. 로컬 명명 된 파이프는 커널 모드에서 실행되며 매우 빠릅니다.

TCP / IP 소켓의 경우 데이터 전송이보다 간소화되고 오버 헤드가 줄어 듭니다. 데이터 전송은 윈도우 잉, 지연된 승인 등과 같은 TCP / IP 소켓 성능 향상 메커니즘을 이용할 수도 있습니다. 이것은 느린 네트워크에서 매우 유용 할 수 있습니다. 응용 프로그램 유형에 따라 이러한 성능 차이가 클 수 있습니다.

TCP / IP 소켓은 백 로그 큐도 지원합니다. 이렇게하면 명명 된 파이프와 비교하여 제한적인 스무딩 효과를 제공하여 SQL Server에 연결하려고 할 때 파이프 사용 중 오류가 발생할 수 있습니다.

일반적으로 TCP / IP는 느린 LAN, WAN 또는 전화 접속 네트워크에서 선호되는 반면, 명명 된 파이프는 더 많은 기능, 사용 편의성 및 구성 옵션을 제공하므로 네트워크 속도가 문제가되지 않을 때 더 나은 선택이 될 수 있습니다.


5

Windows 응용 프로그램의 프로세스 간 통신 (주로) 소켓을 사용하여 Unix의 응용 프로그램간에 통신하는 것과 유사합니다.

MSDN


4
명명 된 파이프는 1975 년경 V6 또는 AT & T Unix에 등장했습니다.
dmckee --- ex-moderator kitten

도! Microsoft보다 약간 앞서 있습니다. 내가 아는 한 유닉스 / 리눅스 애플리케이션에서는 자주 사용되지 않습니다. 진실?
Ken

메일 및 유즈넷 응용 프로그램은 $ HOME / .signature라는 파일에 서명이 필요하기 때문에 .signature를 명명 된 파이프로 생성하고 임의의 따옴표를 씁니다.
Paul Tomblin

3

유닉스 / 리눅스 컨텍스트에서 명명 된 파이프는 쉘이 다른 것을 공유 할 수 없기 때문에 두 개의 다른 쉘이 통신하는 데 사용될 수 있습니다.

또한 동일한 셸에서 두 번 인스턴스화 된 하나의 스크립트는 두 인스턴스를 통해 아무것도 공유 할 수 없습니다. start () 및 stop () 함수가 포함 된 데몬을 코딩 할 때 명명 된 파이프를 사용하고 동일한 스크립트를 사용하여 두 작업을 수행하려고했습니다.

명명 된 파이프 (또는 모든 종류의 세마포)가 없으면 백그라운드에서 스크립트를 시작해도 문제가되지 않습니다. 문제가 끝나면 백그라운드에서 인스턴스에 액세스 할 수 없습니다.

따라서 그에게 stop 명령을 보내려면 할 수 없습니다 : 명명 된 파이프없이 동일한 스크립트를 실행하고 실제로 다른 인스턴스를 실행하고 있기 때문에 stop () 함수를 호출하면 아무것도 수행되지 않습니다.

해결책은 데몬을 시작할 때 두 개의 파이프 (하나는 READ와 다른 하나는 WRITE)를 구현하는 것입니다. 그런 다음 다른 작업 중에서 READ 파이프를 듣습니다. 그런 다음 Stop () 함수에는 파이프에 메시지를 작성하는 명령이 포함되어 있으며,이 명령은 종료 0을 수행하는 백그라운드 실행 스크립트에 의해 처리됩니다. 이런 방식으로 동일한 스크립트의 두 번째 인스턴스는 수행 할 작업에만 있습니다. 첫 번째 인스턴스에게 중지하도록 지시하십시오.

이 방법으로 하나의 스크립트 만 시작하고 중지 할 수 있습니다.

물론 예를 들어 터치를 통해 정지를 트리거하여 다른 방법으로 수행 할 수 있습니다. 그러나 이것은 코딩하기에 좋고 흥미 롭습니다.


1

명명 된 파이프는 프로세스 간 통신을위한 Windows 시스템입니다. SQL Server의 경우, 서버가 클라이언트와 동일한 시스템에있는 경우 TCP / IP가 아닌 이름 지정된 파이프를 사용하여 데이터를 전송할 수 있습니다.


귀하의 답변에 따라 Windows에만 해당되는 것은 아닙니다. 다른 사람들이 이미 언급했듯이, 명명 된 파이프는 일반적으로 특수 파일 인 것처럼 UNIX에서 70 년대 이래로 사용되었습니다. 어쨌든 공감했지만 대답을 수정하십시오.
Chris Charabaruk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.