명명된 파이프
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
명명된 파이프는 프로세스 간 통신(IPC)을 위한 기술로, 유닉스 계열 및 윈도우 운영 체제에서 모두 지원된다. 유닉스 계열에서는 파일 시스템을 사용하여 생성되며, `mkfifo` 또는 `mknod` 명령어를 통해 생성, 삭제 및 사용된다. 윈도우에서는 `CreateFile`, `ReadFile`, `WriteFile` 등을 사용하여 파이프를 관리하며, `\\.\pipe\` 경로에 위치한다. 명명된 파이프는 데이터 압축, 데이터 로딩, 디버깅, 네트워킹 프로토콜 등 다양한 분야에서 활용되며, .NET Framework 및 Microsoft SQL Server에서도 지원된다.
더 읽어볼만한 페이지
- 프로세스 간 통신 - Ajax
Ajax는 웹 페이지 전체를 새로고침하지 않고 비동기적으로 서버와 통신하여 웹 애플리케이션의 일부를 업데이트하는 웹 개발 기술로, XMLHttpRequest 객체의 등장으로 가능해졌으며 HTML, CSS, DOM, JavaScript, JSON 등의 기술을 통합하여 동적인 사용자 인터페이스를 구현한다. - 프로세스 간 통신 - D-Bus
D-Bus는 2002년에 시작된 프로세스 간 통신 시스템으로, 시스템 버스와 세션 버스를 통해 정보 공유, 모듈성, 권한 격리를 제공하며, 일대일 요청-응답 및 발행/구독 통신 방식을 지원한다.
명명된 파이프 |
---|
2. 유닉스 계열
유닉스 계열 운영체제에서 명명된 파이프는 파일 시스템을 사용하며, `mkfifo`[1] 또는 `mknod`[2] 명령어를 사용하여 명시적으로 생성된다. 두 개의 별도 프로세스는 이름을 통해 파이프에 접근할 수 있는데, 한 프로세스는 읽는 쪽(reader)으로, 다른 프로세스는 쓰는 쪽(writer)으로 연다.
2. 1. 생성 및 사용
명명된 파이프는 보통 셸에서 사용하는 이름 없는 파이프와 달리 파일 시스템을 사용한다. `mkfifo`[13] 또는 `mknod`[14] 명령어를 사용하여 명시적으로 만들어진다. 두 개의 별도 프로세스는 이름을 지정하여 그 파이프에 접근할 수 있다. 하나의 프로세스는 독자(reader)로 열고, 다른 하나는 작가(writer)로 연다.예를 들어, 명명된 파이프를 만들고 파이프에 입력된 것을 gzip으로 압축하는 경우 다음과 같이 할 수 있다.
```bash
mkfifo my_pipe
gzip -9 -c < my_pipe > out.gz &
```
별개의 프로세스 셸에서는, 이와는 완전히 독립적으로 압축할 데이터를 보낼 수도 있다.
```bash
cat file > my_pipe
```
명명된 파이프는 일반 파일처럼 삭제할 수 있다.
```bash
rm my_pipe
```
명명된 파이프는 임시 파일을 만들지 않고도 하나의 응용 프로그램에서 다른 응용 프로그램으로 정보를 전달할 수 있게 해준다. 예를 들어, gzip의 압축 해제된 출력을 다음과 같이 명명된 파이프에 연결한다.
```bash
mkfifo --mode=0666 /tmp/namedPipe
gzip --stdout -d file.gz > /tmp/namedPipe
```
그리고 압축이 풀린 데이터를 다음과 같이 MySQL의 테이블에 로드한다.[15]
```sql
LOAD DATA INFILE '/tmp/namedPipe' INTO TABLE tableName;
```
명명된 파이프가 없으면 file.gz을 압축 해제한 것을 일단 임시 파일에 저장해야 MySQL에 로드할 수 있다. 임시 파일에 기록하면 I/O가 더 많이 발생하여, 시간도 오래 걸리고 하드 디스크 공간도 더 필요하게 된다.
PostgreSQL 명령줄 형 프런트 엔드 psql도 명명된 파이프에서 데이터를 로드하는 기능을 갖추고 있다.[16]
2. 2. 활용 예시
명명된 파이프는 임시 파일을 생성하지 않고도 한 응용 프로그램에서 다른 응용 프로그램으로 정보를 전달하는 데 사용될 수 있다.`gzip` 압축 및 해제와 관련하여, 명명된 파이프를 생성하고 여기에 입력된 내용을 `gzip`으로 압축하는 예시는 다음과 같다.[13][14]
```bash
mkfifo my_pipe
gzip -9 -c < my_pipe > out.gz &
```
별개의 프로세스 셸에서는 압축할 데이터를 다음과 같이 독립적으로 보낼 수 있다.
```bash
cat file > my_pipe
```
`gzip`의 압축 해제된 출력을 명명된 파이프에 연결하는 예시는 다음과 같다.
```bash
mkfifo --mode=0666 /tmp/namedPipe
gzip --stdout -d file.gz > /tmp/namedPipe
```
MySQL[15], PostgreSQL[16]과 같은 데이터베이스 시스템에서 명명된 파이프를 활용하여 데이터를 로드할 수 있다. `MySQL` 테이블에 압축 해제된 데이터를 로드하는 예시는 다음과 같다.
```sql
LOAD DATA INFILE '/tmp/namedPipe' INTO TABLE tableName;
```
명명된 파이프가 없으면 `file.gz` 압축 해제 데이터를 임시 파일에 저장해야 하므로, I/O 발생이 많아져 시간과 하드 디스크 공간을 더 필요로 하게 된다.
2. 3. 삭제
rm 명령어를 사용하여 명명된 파이프를 일반 파일처럼 삭제할 수 있다.[13]```bash
rm my_pipe
3. 윈도우
윈도우 운영체제에서 명명된 파이프는 클라이언트-서버 모델을 기반으로 설계되었으며, 유닉스 계열과는 다른 특징을 가진다.
Win32 SDK 함수인 `CreateFile`, `ReadFile`, `WriteFile`, `CloseHandle`을 사용하여 파이프를 열고, 읽고, 쓰고, 닫을 수 있다. 유닉스와 달리 PowerShell을 제외하고는 명령 줄 인터페이스는 없다.
윈도우 명명된 파이프는 일반 파일 시스템 내에서 파일로 생성될 수 없으며, 휘발성을 가져 마지막 참조가 닫히면 제거된다. 모든 파이프는 `\\.\pipe\` 경로에 마운트된 명명된 파이프 파일 시스템(NPFS)의 루트 디렉토리에 배치된다. 예를 들어, "foo"라는 이름의 파이프는 `\\.\pipe\foo`라는 전체 경로 이름을 갖는다. 파이프라인에 사용되는 익명 파이프는 실제로 임의의 이름을 가진 명명된 파이프이다.
Windows 95는 명명된 파이프의 클라이언트를 지원하며, Windows NT 계열 운영체제에서는 클라이언트와 서버를 모두 지원한다.
3. 1. 특징
명명된 파이프는 `\\.\pipe\` 경로에 마운트된 명명된 파이프 파일 시스템(NPFS)의 루트 디렉터리에 특수한 파일 형태로 생성된다.[5] "foo"라는 이름의 파이프는 `\\.\pipe\foo`라는 전체 경로 이름을 갖는다.[5]다음은 명명된 파이프의 주요 특징이다.[5]
특징 |
---|
머신 간 및 머신 내 프로세스 간 통신(IPC) |
반이중 또는 전이중 통신 |
바이트 지향 또는 패킷 지향 통신 |
신뢰성 있는 연결 지향 통신 |
블로킹 또는 논블로킹 읽기 및 쓰기 선택 가능 |
표준 장치 I/O 핸들( `ReadFile`, `WriteFile` 등) 사용 |
핸들 생성을 위한 네임스페이스 사용 |
비효율적인 WAN 트래픽 (명시적인 데이터 전송 요청) |
엿보기 읽기 (파이프의 입력 버퍼에서 제거하지 않고 읽기) |
3. 2. 활용 예시
VMware Workstation은 에뮬레이션된 직렬 포트를 호스트 시스템에 명명된 파이프로 노출할 수 있다.[5] 마이크로소프트의 WinDbg는 디버깅 세션의 전송 수단으로 명명된 파이프를 지원한다.[5] VMware와 WinDbg를 함께 사용하면, 드라이버 개발자가 단일 컴퓨터에서 개발 및 테스트를 수행할 수 있다.[5] 두 프로그램 모두 사용자에게 `\\.\pipe\''name''` 형식으로 이름을 입력하도록 요구한다.[5].NET Framework 3.5는 명명된 파이프 지원을 추가했다.[5]
마이크로소프트 SQL 서버는 클라이언트와의 연결에 명명된 파이프를 사용할 수 있다.[6]
서버 메시지 블록(SMB)은 특수 프로세스 간 통신(IPC) 공유를 사용하는 네트워킹 프로토콜이며, SMB의 IPC는 사용자의 인증 컨텍스트를 명명된 파이프로 원활하고 투명하게 전달할 수 있다.[6]
3. 3. 보안
Windows NT 명명된 파이프는 보안 컨텍스트를 상속할 수 있다.[5]참조
[1]
웹사이트
mkfifo, mkfifoat - make a FIFO special file
https://pubs.opengro[...]
The Open Group
[2]
웹사이트
mknod, mknodat - make directory, special file, or regular file
https://pubs.opengro[...]
The Open Group
[3]
웹사이트
13.2.7 LOAD DATA Statement
https://dev.mysql.co[...]
MySQL
2020-05-19
[4]
웹사이트
Re: psql and named pipes
https://www.postgres[...]
PostgreSQL
2008-03-27
[5]
웹사이트
System.IO.Pipes Namespace
https://docs.microso[...]
Microsoft Developer Network
[6]
웹사이트
How to connect to SQL Server by using an earlier version of SQL Server
https://support.micr[...]
Microsoft
2019-11-19
[7]
URL
mkfifo()
http://www.opengroup[...]
[8]
URL
mknod()
http://www.opengroup[...]
[9]
URL
MySQL 5.1 Reference Manual :: 12.2.6 LOAD DATA INFILE Syntax
http://dev.mysql.com[...]
[10]
URL
http://postgresql.10[...]
[11]
URL
http://msdn.microsof[...]
[12]
URL
SQL Server 2005 または SQL Server 2000 の名前付きインスタンスに以前のバージョンの SQL Server のクライアント ツールを使用して接続する方法
http://support.micro[...]
[13]
URL
mkfifo()
http://www.opengroup[...]
[14]
URL
mknod()
http://www.opengroup[...]
[15]
URL
MySQL 5.1 Reference Manual :: 12.2.6 LOAD DATA INFILE Syntax
http://dev.mysql.com[...]
[16]
웹인용
보관된 사본
https://web.archive.[...]
2010-12-05
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com