본문 바로가기
Linux

[Linux] Pipe

by RTLog 2024. 3. 14.
728x90
반응형

안녕하세요. RTLog입니다.

 

오늘은 'Pipe'라는 개념에 대해 작성해보겠습니다. 

Pipe

Linux에서 파이프는 한 명령의 출력을 다른 명령의 입력으로 사용할 수 있도록 하는 메커니즘입니다. 여러 명령을 시퀀스로 연결할 수 있으며, 여기서 한 명령의 출력은 중간 파일 없이도 다른 명령의 입력으로 직접 전달될 수 있습니다.

 

* Redirection은 표준 스트림을 파일로 연결했다면, Pipe는 스트림을 명령어의 입출력으로 연결합니다. 

* Redirction: 2024.03.14 - [Linux] - [Linux] Redirection

Pipe Concept

 

 

Pipe 연결을 위해서 수직 막대 문자 '|'로 표시되는 기호를 사용합니다. 

 

"어떤 텍스트 파일의 행/단어 개수를 확인"하는 예를 들어 설명해볼게요.

 

먼저, wc 명령어입니다. 

  • wc (word counter) 명령어: 파일에 포함된 줄 수, 단어 수, 바이트 수를 표시하는 데 사용
    • -l: Display the number of lines.
    • -w: Display the number of words.
    • -c: Display the number of bytes.
    • -m: Display the number of characters.
    • -L: Display the length of the longest line.
    • wc를 실행하면 표준 입력을 기다리고 빈 줄에서 Ctrl + D를 누르면 개수가 표시됩니다.
    • Ctrl + D는 EOF( End Of File)을 의미하며, 표준 입출력을 중단할 수 있습니다.

word count

 

"cat temp.txt" 명령어의 출력이 'wc' 명령의 입력으로 사용되어, 행-단어-문자 개수를 출력한 모습입니다. 

cat 명령어의 출력이 Pipe로 연결되어, wc의 입력으로 사용된 것을 알 수 있습니다. 

pipe with wc

 

Named Pipe

위 예제에서는 두 명령어의 입출력을 '|'를 사용하여 직접 연결해주었는데요.

Pipe를 직접 생성 후 이름을 지어주어 연결할 수 있다면, 더 편리하게 사용할 수 있습니다.

 

1. 터미널을 2개 열어주세요.

    (*저는 tmux라는 플러그인을 사용했습니다. 추후 기회가 되면 작성하겠습니다.)

2. "mkfifo" 명령어를 통해 fifo(first in first out)를 하나 생성합니다.

     -> pipe 연결을 위한 메모리 공간 생성

3. 하나의 터미널에서 cat 명령어의 출력을 tempfifo로 연결합니다. 

4. 다른 터미널에서 cat 명령어의 입력을 tempfifo로 연결합니다. 

5. 출력을 연결했던 터미널에서 cat 명령어 입력을 작성합니다. 

 

결과는 어떻게 될까요? 왼쪽 터미널에 작성한 입력이 fifo를 통해 전달되어, 오른쪽 터미널의 입력으로 사용됩니다. 왼쪽에 입력한 내용이 오른쪽에 출력되는 모습을 확인하실 수 있습니다. 

 

아래와 같은 다양한 활용도 가능합니다. 

# Multi-Pipe
command1 | command2
command1 | command2 | command3

# With Redirection 
command1 < input_file | command2 > output_file

# 양방향 통신 
command1 <pipe1 | command2 >pipe1
command2 <pipe2 | command1 >pipe2

 

Linux의 Pipe 기능을 활용하면, 프로세스 간 통신, 필터링 및 데이터 변환, 동시성 및 병렬성 등을 효율적으로 구현할 수 있습니다. 

 

감사합니다. 

 

728x90
반응형

'Linux' 카테고리의 다른 글

[Linux] C Shell Script - 변수  (0) 2024.03.26
[Linux] Permission  (0) 2024.03.15
[Linux] Redirection  (0) 2024.03.14
[Linux] 인용과 확장 - 인용  (0) 2024.03.14
[Linux] 인용과 확장 - 확장  (0) 2024.03.14

let textNodes = document.querySelectorAll("div.tt_article_useless_p_margin.contents_style > *:not(figure):not(pre)"); textNodes.forEach(function(a) { a.innerHTML = a.innerHTML.replace(/`(.*?)`/g, '$1'); });