기초 리눅스 API Vol.2 (1)

Erdos·2025년 6월 3일

LINUX/UNIX

목록 보기
3/8
post-thumbnail

ABOUT


☕1차적으로 읽으려는 부분

-- 프로세스 위주로
[Vol.1]
1~5장까지는 가볍게 읽기
6장 프로세스
24장 프로세스 생성
25장 프로세스 종료
26장 자식 프로세스 감지
27장 프로그램 실행

28~31장 읽기

-- 파이프란?
[Vol.2]
7장 파이프와 FIFO

7장 파이프와 FIFO

7.1 개요

  • pipe: 한 프로세스가 출력한 데이터를 다른 프로세스가 읽을 수 있도록 연결해주는 일종의 데이터 통로(버퍼)
  • FIFO: named pipe. 이름(파일경로)를 가진 특수 파일

파이프는 바이트 스트림이다

파이프를 통과하는 데이터는 순차적으로 전송되어 정확히 쓰여진 순서대로 읽힌다

파이프 읽기

비어있는 파이프로부터 데이터를 읽어오려면 적어도 한 바이트를 파이프에 써야 한다. -> (파이프가 비어 있다면 읽기는 블록 상태가 됨)

파이프는 단방향성이다

  • one way pipe
  • 한쪽에서는 데이터만 쓸 수 있고, 다른 쪽에서는 데이터만 읽을 수 있음
  • 파이프 하나로는 한 방향으로만 데이터가 흐른다

PIPE_BUF바이트씩 쓰면 아토믹이 보장된다

  • pipe_buf: 아토믹 보장 최대 크기. 보통 4096byte(4KB)로 정의되어 있음

파이프 용량은 제한되어 있다

  • 파이프의 버퍼는 커널 메모리에서 관리
  • 일단 파이프가 다 차면 읽기로 파이프의 데이터가 소모되지 않는 한 더 이상의 파이프 쓰기를 금지한다

7.2 파이프 만들기와 사용하기

사용하지 않는 파이프 파일 디스크립터 닫기

int fd[2];
pipe(fd);
if (fork() == 0) 
{
    // 자식: 파이프에서 읽기만 할 것
    close(fd[1]); // **꼭 닫아야 함!**
    // ... read(fd[0], ...)
} 
else 
{
    // 부모: 파이프에 쓰기만 할 것
    close(fd[0]); // **꼭 닫아야 함!**
    // ... write(fd[1], ...)
}

사용하지 않는 fd를 닫아야 하는 이유
1) 블록/데드락 방지

  • 읽기 측에서 close(fd[1])을 안 했을 때,
    • 파이프에서 읽을 데이터가 없다면 모든 writer가 fd[1]을 닫을 때까지 read()는 EOF를 리턴하지 않음
    • 부모 자식 모두 fd[1]을 열고 있으면, 실제로 쓸 프로세스가 write를 끝내고 fd[1]을 닫았더라도 상대편이 fd[1]을 열고 있으면 read가 계속 기다림 상태에 빠진다
  • 쓰기 측에서 close(fd[0])을 안 했을 때,
    • 원래 write 측에서는 읽는 일이 없으므로 fd[0]을 닫지 않으면 fd 낭비 및 리소스 누수가 발생할 수 있다

2) 자원(리소스) 누수 방지

  • 각 프로세스는 사용할 fd 개수에 한계가 있음(ulimit -n)
  • 안 쓰는 fd를 남기면 fd가 불필요하게 소모되고 많은 fork/pipe 사용 시 시스템 한계에 걸릴 수 있다
  • fd를 닫아야만 파이프가 폐기되고 자원을 다른 프로세스에서 사용할 수 있음

7.3 파이프로 프로세스 동기화

  • 동기화: 한 쪽에서 신호를 보내거나 데이터가 올 때까지 대기
  • 데이터뿐 아니라 동기화 신호 전달에도 활용 가능
profile
수학을 사랑하는 애독자📚 Stop dreaming. Start living. - 'The Secret Life of Walter Mitty'

0개의 댓글