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