+--------------------------------------------+
제            목 : Introduction to Named Pipes
원문서 작성자 : Andy Vaught
원문서 작성일 : 1997. 11. 01
번    역     일 : 2003. 07. 25
번    역     자 : 세벌쉭
코    멘     트 : 오역이 난무 하므로 원문과 같이 ..........
+--------------------------------------------+


제목 : Introduction to Named Pipes

리눅스의 유용한 특징중에 하나는 프로세스간 통신을 가능케 하는 "네임드 파이프"이다.

1. 일반적으로 우리가 알고 있는 파이프 "언네임드 파이프"
================================================
리눅스와 다른 유닉스계열 운영체제를 유용하게 만드는 기본적인 특징들 중에 하나는 "파이프"이다.  파이프는 명확하게 함께 작업하도록 디자인되어지지 않는 분리되어진 프로세스들로 하여금 통신할수 있게끔 해준다.  파이프는 기능이 매우 제한적인 툴들이 다양한 방법으로 서로 조합을 통해서 다양한 기능을 발휘 할 수 있도록 하여 준다.  파이프 사용에 관한 간단예제는 다음과 같다.

ls | grep x

bash(이하 본쉘)은 명령라인을 조사할때 두 명령을 분리하는 수직바 문자(|)를 발견한다. 본쉘과 다른 쉘들은 두개의 명령을 실행한다. 이때 첫번째 명령의 출력은 두번째 명령의 입력으로 연결되게 된다.  ls 프로그램은 현재 디렉토리의 리스트를 만든다. grep 프로그램은 ls 의 출력을 읽고 문자 x 를 포함하는 라인들을 출력하게 된다.

대부분의 유닉스 사용자들이 친숙한 위의 예제는 "언네임드 파이프" 예제이다.  파이프는 단지 커널 내부에 존제 하게 되고 그것(이 경우에 본쉘)을 만든 프로세스에 의해서 접근되어 질수 없다.  사람들이 이미 알고 있지 못한 것들은, 패어런트 프로세스는 프로그램을 시작한 첫번째 프로세스이고 차례대로 프로그램을 실행하기 위해서 분리된 차일드 프로세스들을 만들어 낸다.


2. 파이프의 다른 종류 "네임드 파이프"
================================
파이프의 다른 종류는 "네임드 파이프"이다. 이것은 때로는 FIFO 이라고 불리워 진다. FIFO "First In, First Out" 의 약자이고 이것은 들어오는 바이트 순서대로 똑같은 출력은 내보내는데 적합하다.  "네임드 파이프"의 이름은 실제로는 파일 시스템안에 있는 파일 이름이다.  파이프들은 ls 명령으로 보여지는데 약각의 차이점이 있다. 아래를 보자.

% ls -l fifo1
prw-r--r--   1 andy  users    0 Jan 22 23:11 fifo1|

가장 왼쪽에 있는 p 는 fifo1 파일이 파이프라는 것을 표시해 주고 있다. 나머지 퍼미션 비트들은 일반적인 파일들 처럼 누가 파이프에 읽고 쓸수 있는지를 나타 내 주고 있다.  최신 버전의 ls 명령을 가지고 있고 칼라 옵션을 가지고 있는 리눅스 시스템 상에서 파일명의 끝에 |  문자(\ 버튼에 함께 있는)를 가지고 있는지에 대한 근거는 파일명 "fifo|" 이 디폴트로 빨간색으로 표시 된다는 것이다.

옛날 리눅스 시스템상에서 "네임드 파이프들은 mknod 프로그램( 일반적으로 /etc 디렉토리상에 위치해 있다)에의해서 만들어 졌다. 요즘의 시스템상에서는 mkfifo 가 표준 유틸리티이다. mkfifo 프로그램은 한개나 그 이상의 파일 이름들을 아규먼트로 취한고 그 화일이름으로 파이프들을 만들어 낸다. 예를 들자면 "네임드 파이프"이 "pipe1"인 파이프를 만들기 위해서 다음과 같이 명령하면 된다.

mkfifo pipe1

네임드 파이프가 어떻게 작동하는지 보여주기 위해서 여기 간단한 예제를 만들었다. 가상 콘솔 1번에서 위에 보여주는 것과 같이 pipe 를 만들었다고 가정한다. 이어서 다음과 같이 입력하라.

ls -l > pipe1

이어서 다른 콘솔에서 다음을 입력하라.

cat < pipe1

아싸 ! 첫번째 콘솔상에서 실행한 명령의 출력은 두번째 콘솔에 나타난다.  명령과는 상관없이 당신이 실행하는 순서에 유의 하라.

만일 당신이 전에 가상 콘솔들을 사용하지 않았다면 다음 문서를 보기 바란다.
``Keyboards, Consoles and VT Cruising'' by John M. Fisk in the November 1996 Linux Journal. 

만일 유의 깊게 살펴본다면 당신이 실행한 첫번째 명령이 바로 종료 되어지지 않는 다는 것을 알게 될 것이다.  파이프의 다른 끝이 아직 연결되지지 않았기 때문에 나타난 현상이다. 그래서 커널은 첫번째 프로세스를 일시정지 시킨다.  두번째 프로세스가 파이프를 오픈 할때까지 말이다.  유닉스 상에서 말하기로는 프로세스가 블록되어 졌다고 말한다. 그래서 그것은 어떤일이 일어나기를 기다리는 것이다.


3. "네임드 파이프"  응용
====================
네임드 파이프의 다른 유용한 응용은 전혀 관련이 없는 프로그램들을 서로 통신할 수 있도록 하여 주는 것이다.  예를 들자면  몇몇 소트 요청을 처리하는 프로그램(파일들을 출력하거나 데이타베이스에 접근하는)은 읽기위해서 파이프를 오픈할 수 있다. 그리고 나서 다른 프로세스가 파이프를 오픈하고 명령을 출력함으로서 요청을 만들수 있다. 즉, 서버는 클라이언트의 도움으로 작업을 수행 할 수 있는 것이다.  만일 클라이언트가 쓰지를 않거나 서버가 읽지를 않는다면 블로킹이 발생할 것이다.

파이프의 광란
------------
두개의 네임드 파이프를 만들어라. pipe1, pipe2. 그리고 다음과 같이 입력하라.

$echo -n x | cat - pipe1  >pipe2 &
$cat <pipe2  >pipe1

스크린 상에는 아마것도 나타나지 않을 것이다. 하지만 만일 당신이 top 명령을 실행하게 된다면 당신은 cat 프로그램들이 문자 x 를 미친듯이 복사 하고있는 것을 보게 될 것이다.

루프를 벗어 나기 위해서 컨트롤 씨 를 누른 후에 당신은 "broken pipe" 메시지를 받을 것이다.  이 에러는 파이프를 읽는 프로세스가 그것의 끝쪽을 닫았을때 그 파이프에 기록을 하게 되었을때 발생한다.  읽는 자가 사라져 버렸으므로 데이타는 더이상 갈곳이 없는 것이다.  일반적으로 쓰는자는 데이타의 쓰는 것을 종료하고 파이프를 닫는다.  이러한 관점에서 보면 읽는자는 EOF 을 발견하게 되고 그에 때른 요청을 실행한다.

 컨트롤 씨 가 눌려지는 정확한 시점에 따라서 broken pipe 메시지는 나타나던지 그러지 않던지 할 것이다. 만일 두번째 cat 이 x 를 바로 읽은 다음에 컨트롤 씨가 두번째 cat 를 종료 시켰다면 파이프1 은 종료되어지고 첫번째 cat 은 아무말 없이(메시지 없이) 종료 할 것이다.  즉, 만일 두번째 cat 이 첫번째 cat 이 x 를 기록하기를 기다리고 있다면 컨트롤 씨는 첫번째 cat 이 그것(엑스)를 기록 하기전에 파이프2 를 닫게 할 것이다. 바로 이럴때 에러 메시지는 발생 되어 질 것이다.  이런한 항상 일치하지 않는 행동 양상은 "레이스 컨디션"이라고 알려져 있다.


명령 치환
---------
본쉘은 실제로 적절한 방법으로 네임드 파이프를 사용한다.  당신이 소괄호-()-로 명령을 감싸서 명령을 호출하게 되면 명령은 실제로 서브쉘상에서 실행되어진다. 즉, 쉘은 그 자신을 복제하고 복제판은 소괄호 안에 있는 명령들을 해석한다. 그래서 바깥쪽 쉘은 단지 단일 명령을 실행 하고 있는 것이다. 모든 명령어들의 출력은 단일 한 것 처럼 리다이렉트 되어 질 수 있다. 예를 들자면 다음 명령에서 :

(ls -l; ls -l) >ls.out

현재 디렉토리 리스트 두개가 ls.out 화일에 출력 되어진다.

명령 치환은 왼쪽 소괄호--(--의 앞에 < 나 > 을 덧붙였을때 발생한다. 예를 들면 다음과 같이 명령을 내리면

cat <(ls -l)

보통 서브쉘안에서 명령 "ls -l"을 실행한다. 하지만 출력은 임시 네임드 파이프(본쉘이 만들고 이름을 붙이고 나중에 지울)로 재 지향되어진다.  그러므로 cat은 읽기위한 유효한 파일 이름을 가진다. 그리고 우리는 "ls -l" 의 출력을 보게된다.  보통때 행해 지는 것보다 한단계의 과정을 더 거치게 된다.  비슷하게 ">(명령들)" 로 주어지게 되면. 이때 본쉘은 소괄호 안에 있는 명령들이 입력을위해 읽어드릴 임시 파이프에 이름 붙인다.

만일 당신이 두 디렉토리에 같은 이름을 가지고 있는 화일이 있는지를 알아 보기를 원한다면. 다음과 같이 명령하면 될 것이다.

cmp <(ls /dir1) <(ls /dir2)

비교하는 프로그램은 cmp 는 읽고 비교할 두파일의 이름을 보게 될것이다.

**위의 명령에서 <(ls /dir1) 은 /dev/fd/63 이라는 화일 디스크립터를 만들었고 그곳에 디렉토리 리스트를 출력했다. <(ls /dir2) 는 /dev/fd/62 이라는 화일 디스크립터를 만들었고 그곳에 디렉토리 리스트를 출력했다. /dev/fd/63 과 /dev/fd62 라는 두 화일을 비교 했다. 

명령은 치환은 tee 명령(명령의 출력을 보고 저장하기위해서 사용되어진다)을 보다 유용하게 사용 할 수 있도록 해 준다.  당신은 입력이 임시화일에 리소팅되어짐 없이 여러 리더(reader)들에 의해서 읽혀질수 있도록 할 수 있다. 본쉘은 당신을 위해 이러한 모든 작업을 해 줄 것이다. 다음 명령을 보라 :

ls | tee >(grep foo | wc >foo.count)
         >(grep bar | wc >bar.count)
         | grep baz | wc >baz.count

ls 의 출력에 나타나는 foo, bar, baz 수를 카운트 한다. 그리고 세개의 분리된 화일에 정보를 출력한다. 명령치환은 내포되어질수 있다.(nested)

cat <(cat <(cat <(ls -l))))

위 명령은 현재의 디렉토리의 리스트를 보여주기 위해서 간접적인 방법으로 작업을 한다.

보여 지는 것 처럼, 언네임드 파이프는 간단한 명령들을 줄줄이 엮어 놓는것을 가능하게 한다.  네임드 파이프는 본쉘의 약간의 도움을 받아서 파이프들의 전체 구조가 만들어 지는 것을 허용한다.
단지 당신의 상상력의 부재가 가능성들을 제한 할 것이다.
 
Andy Vaught 는 현재(문서 작성 당시 겠죠) 애리조나 주립 대학에서 계산 물리학의 박사 과정에 있다.  버전 1.1 이래로 리눅스를 사용 하고 있고. 시민 항공 순찰 에서 비행을 즐기고 있으며 또한 스키도.... 다음 메일 주소로 그와 연락 할 수 있다.      ****@*******.la.asu.edu. 


반갑습니다.
세벌쉭 2017-07
이 문서는 당시 이해했었나  ?
가물가물
NeOpLe 2017-10
cat <(cat <(cat <(ls -l))))

이걸 보니 새삼스럽네요.
번역 수준을 보니 95%는 이해하셨던 듯 합니다.




제목Page 2/14
2017-12   25109   츄네다
2017-12   26668   차넷컴퓨터
2017-11   27427   NGC
2017-11   29211   엠브리오
2017-09   34202   PPC허인구
2017-09   33905   이선호
2017-08   35315   DDAYs
2017-07   40264   세벌쉭
2017-07   38816   세벌쉭
2017-07   36607   세벌쉭
2017-07   32615   세벌쉭
2017-07   32346   세벌쉭
2017-07   30458   세벌쉭
2017-07   29324   세벌쉭
2017-07   24973   세벌쉭
2017-07   24177   세벌쉭
2017-07   22902   세벌쉭
2017-07   22284   세벌쉭
2017-07   17772   세벌쉭
2017-07   17190   PPC허인구