이 글에서는 리눅스 환경에서 파이프(pipe)를 활용하는 C 프로그램을 직접 만들어 보겠습니다. 이 프로그램은 입력 스트림으로부터 텍스트를 읽어 들인 후, 이를 출력 화면에 그대로 표시하는 역할을 합니다.
리눅스 파이프(pipe)란 무엇인가?
파이프는 데이터를 전송하기 위한 통신 수단으로, 리눅스 또는 유닉스 기반 시스템에서 프로세스·명령어·프로그램 간에 표준 출력(standard output)을 전달할 때 사용됩니다. 셸에서 자주 쓰이는 ls | grep txt와 같은 명령 조합도 내부적으로는 파이프를 통해 두 명령 사이의 데이터 흐름을 연결하는 것입니다.
파이프의 가장 중요한 특징 중 하나는 단방향(unidirectional)이라는 점입니다. 즉, 데이터는 한쪽 방향으로만 흐를 수 있으며, 양방향 통신이 필요하다면 파이프를 두 개 생성해야 합니다.
프로그램의 동작 원리
여기서는 사용자로부터 입력을 받아 파이프에 기록(write)한 뒤, 다시 파이프에서 읽어(read) 출력 화면에 표시하는 구조를 구현합니다. 이때 크기가 2인 정수 배열을 사용하며, 각 요소의 역할은 다음과 같습니다.
- Pipe[0] : 파이프의 읽기(read) 끝단 — 파이프에서 데이터를 꺼낼 때 사용
- Pipe[1] : 파이프의 쓰기(write) 끝단 — 파이프에 데이터를 넣을 때 사용
C 코드 예제
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
int Pipe[2];
char string[100];
// 파이프 생성 실패 시 에러 메시지 출력 후 종료
if (pipe(Pipe) == -1) {
perror("Failed to create pipe");
exit(1);
}
scanf("%s", string); // 사용자 입력 받기
write(Pipe[1], string, strlen(string)+1); // 파이프의 쓰기 끝단에 데이터 기록
printf("\n");
read(Pipe[0], string, 5); // 파이프의 읽기 끝단에서 데이터 읽기
printf("%s", string); // 화면에 출력
}
코드 단계별 설명
- pipe(Pipe) : 커널에 파이프 생성을 요청하고, 성공하면 읽기/쓰기용 파일 디스크립터 두 개를 배열에 저장합니다.
- scanf() : 사용자로부터 문자열을 입력받습니다.
- write() : 입력받은 문자열을 파이프의 쓰기 끝단(Pipe[1])에 기록합니다.
- read() : 파이프의 읽기 끝단(Pipe[0])에서 데이터를 다시 읽어옵니다.
- printf() : 읽어온 데이터를 출력 화면에 표시합니다.
실행 결과
input: TutorialsPoint TutorialsPoint
사용자가 입력한 문자열이 파이프를 거쳐 그대로 출력되는 것을 확인할 수 있습니다. 이처럼 파이프는 프로세스 간 데이터 전달을 간단하고 효율적으로 처리할 수 있는 강력한 IPC(프로세스 간 통신) 도구입니다.