파이프
부모와 자식 간 통신을 다룹니다
파이프은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
파이프란 무엇인가
파이프는 서로 관련된 프로세스 사이에서 사용하는 단방향 통신 채널입니다. 한 프로세스가 바이트를 파이프에 쓰면 다른 프로세스가 읽습니다. 데이터가 컨베이어 벨트를 따라 이동하는 것과 비슷합니다.
두 개의 파일 디스크립터
pipe() 호출은 두 요소로 된 배열을 채웁니다. fd[0]은 읽기 끝이고 fd[1]은 쓰기 끝입니다. fd[1]에 쓴 데이터는 fd[0]에서 읽을 수 있습니다.
#include <unistd.h>
#include <stdio.h>
int make_pipe(int fd[2]) {
if (pipe(fd) < 0) { perror("pipe"); return -1; }
/* fd[0] read end, fd[1] write end */
return 0;
}fork와 결합하기
fork()를 호출하면 부모 프로세스와 자식 프로세스가 모두 파이프의 디스크립터를 공유합니다. 이렇게 한쪽이 쓰고 다른 쪽이 읽는 방식으로 부모와 자식이 통신합니다.
사용하지 않는 끝 닫기
각 프로세스는 사용하지 않는 끝을 닫아야 합니다. 읽는 프로세스는 쓰기 끝을 닫고, 쓰는 프로세스는 읽기 끝을 닫습니다. 그렇지 않으면 읽는 프로세스가 파일 끝을 절대 확인하지 못합니다.
#include <unistd.h>
void parent_as_writer(int fd[2]) {
close(fd[0]); /* parent will not read */
write(fd[1], "hello", 5); /* parent writes */
close(fd[1]); /* signal EOF to reader */
}부모와 자식 예제
부모 프로세스가 메시지를 쓰고 자식 프로세스가 읽습니다. 각 프로세스는 필요하지 않은 끝을 닫습니다.
#include <unistd.h>
#include <stdio.h>
void demo(int fd[2]) {
if (fork() == 0) { /* child: reader */
close(fd[1]);
char buf[64];
ssize_t n = read(fd[0], buf, sizeof buf - 1);
buf[n] = 0;
printf("child got: %s\n", buf);
close(fd[0]);
} else { /* parent: writer */
close(fd[0]);
write(fd[1], "hi child", 8);
close(fd[1]);
}
}읽기에서 EOF 반환
모든 쓰기 끝이 닫히면 read는 0을 반환하여 파일 끝을 알립니다. 쓰기 끝 하나라도 열린 채로 있으면 읽는 프로세스가 더 많은 데이터를 기다리며 영원히 차단됩니다. 이는 흔한 오류입니다.
파이프 용량과 차단
파이프에는 유한한 버퍼가 있습니다(대개 64 KB). 버퍼가 가득 차면 write가 차단되고 읽는 프로세스가 데이터를 비울 때까지 기다립니다. 비어 있으면 read가 데이터가 도착할 때까지 차단됩니다. 이러한 흐름 제어가 두 프로세스를 동기화합니다.
dup2로 방향 전환하기
dup2를 사용하면 프로세스의 표준 입력이나 표준 출력을 파이프의 한쪽 끝으로 바꿀 수 있습니다. 셸은 이 방식으로 cmd1 | cmd2를 구현하여 한 명령의 출력을 다음 명령의 입력에 연결합니다.
#include <unistd.h>
void stdout_to_pipe(int fd[2]) {
close(fd[0]);
dup2(fd[1], STDOUT_FILENO); /* writes to stdout go into pipe */
close(fd[1]);
}이름 있는 파이프(FIFO)
일반 파이프는 서로 관련된 프로세스만 연결합니다. 이름 있는 파이프(FIFO)는 mkfifo로 만들며 파일 시스템에 나타나므로, 서로 관련되지 않은 프로세스도 경로로 열어 통신할 수 있습니다.
#include <sys/stat.h>
int make_fifo(const char *path) {
return mkfifo(path, 0666); /* creates a FIFO file */
}SIGPIPE의 위험
읽기 끝이 닫힌 파이프에 쓰면 SIGPIPE가 발생하며, 기본 동작은 프로세스를 종료하는 것입니다. 신호를 무시하거나 write에서 반환되는 EPIPE 오류를 확인하십시오.
파이프를 사용하는 경우
파이프는 부모와 자식 사이의 단순한 단방향 스트리밍이나 프로그램 연결에 적합합니다. 양방향 통신이나 서로 관련되지 않은 프로세스 간 통신에는 FIFO, 소켓 또는 공유 메모리를 고려하십시오.
빠른 확인
파이프에 대한 이해도를 확인해 보십시오.
복습
부모와 자식 간 통신에 파이프를 사용하는 방법을 배웠습니다.
pipe()는 fd[0](읽기)과 fd[1](쓰기)을 제공합니다fork와 결합하고 사용하지 않는 끝을 닫습니다- 모든 쓰기 끝이 닫힌 상태에서 EOF에 도달하면 read는 0을 반환합니다
- FIFO는 서로 관련되지 않은 프로세스를 연결하며 SIGPIPE에 주의해야 합니다
자주 묻는 질문
“파이프” 강의는 무료인가요?
네 — “파이프” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“파이프”에서 뭘 배우나요?
부모와 자식 간 통신을 다룹니다 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“파이프” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.