본문 바로가기
컴터/Linux

[Linux/리눅스] Pipe(파이프)

by 나 진짜 못차마 2023. 8. 12.
728x90


리눅스 파이프(Pipe)는 프로세스 간 통신(IPC)의 한 형태로,

"한 프로세스의 출력을 다른 프로세스의 입력으로 연결하여 데이터 스트림을 전달하는 메커니즘" 이다.

프로세스간 단 방향 통신의 한 방법이며, 기본적으로 동기화 방식으로 제공한다.

( * 아주 간단하게 동기화 특징을 설명하자면 하나 끝나면 다음, 하나 끝나면 다음 형태로 순서대로 진행되는 것을 의미)

 

파이프를 사용하면 여러 명령어나 프로세스를 조합하여 데이터를 처리하거나 변환할 수 있다.

파이프는 리눅스 쉘에서 주로 사용되며, 파이프 기호 ' | ' 를 사용하여 표현된다.

 

command1 | command2

ls | grep ".txt$"
# ls 명령어를 사용하여 현재 디렉토리의 파일 리스트를 얻은 다음, 
# 그 결과를 grep 명령어를 사용하여 "txt"로 끝나는 파일들만 필터링.

 

그럼 c 코드에서 어떻게 동작시킬 수 있을까.

 

#include <stdio.h>
#include <unistd.h>
#define MAX_SIZE 30

int main(void){
    int fd[2];

    char msg_input[MAX_SIZE];
    char msg_output[MAX_SIZE] = "This is Message !!";

	# pipe() 함수를 호출하여 
	# 파이프의 읽기(read)와 쓰기(write)를 가리키는 파일 디스크립터가 생성된다.
    if (pipe(fd) == -1){
        perror("pipe error\n");
        return 1;
    }

    int pid = fork();
    if( pid > 0){
        printf("Parent\n");
        close(fd[0]);
        write(fd[1],msg_output, MAX_SIZE);  
        close(fd[1]);
    }
    else if(pid == 0){
        printf("\t\tChild\n");
        close(fd[1]);
        read(fd[0],msg_input, MAX_SIZE);
        close(fd[0]);
        printf("\t\t%s\n",msg_input);
    }
    else{
        perror("fork error\n");
        return 1;
    }
    return 0;
}

 

파일 디스크립터를 왜 read 혹은 write할 때 다른 쪽 디스크립터를 close 해야하나?

앞서 말했듯 Pipe는 단방향 통신이다.

파이프의 읽기와 쓰기는 둘 다 독립적인 개체라서 열어두면 언제든 읽고 쓸 수 있다.

C 코드에서 쓰기, 읽기 작업을 하기 전,

반대 디스크립터를 닫고, 동작 후 해당 파일 디스크립터를 닫아주는 것은 파이프를 올바르게 사용하기 위한 중요하다.

이렇게 함으로써 파이프의 읽기 끝을 통해 데이터를 읽는 프로세스는 데이터가 완전히 쓰여진 후에 읽게 되므로 데이터의 일관성과 안전한 통신이 보장된다.

728x90