UNIX Special Files

난1렙이요·2024년 11월 18일
0

시스템 프로그래밍

목록 보기
17/22

Pipe

  • 프로세스간의 통신은 OS의 도움을 받아야 한다.
  • Pipe는 UNIX에서 제일 간단한 통신 방법이다.
  • Pipe는 특별한 파일로 나타난다.
  • Pipe는 같은 시스템 안에서 작동하는 프로세스들 간에 정보를 공유하기 위한 방법이다.
#include <unistd.h>
int pipe(int fd[2]); 
  • pipe를 실행하면 자동으로 pipe객체가 open된다.
  • int fd[2] : pipe()는 I/O방식을 구현한다. 그렇기 때문에 두 file descriptor를 되돌려주는데, 이것이 바로 매개변수로 들어오는 배열의 정체다.
    • fd[0]은 reading할 때 사용한다.
    • fd[1]은 writing할 때 사용한다.
  • fd[1]에 쓰여진(written) 정보는 fd[0]에서 읽을(read) 수 있으며, FIFO(First-In-First-Out)를 기본으로 한다.
  • 만약 성공적으로 완료되면 0을 return한다.
  • 만약 오류가 생기면 -1을 return한다.

Pipe의 특성

  • Pipe는 외부적으로 나타나는 특정한 이름이 없다.
    • 그러므로 프로그램은 이름으로 Pipe에 접근하는 게 아니라 두 개의 file descriptor를 통해서만 접근 가능하다.
  • 이러한 이유 때문에 Pipe는 아래와 같은 상황에서만 사용한다.
    • Pipe를 만든 프로세스
    • Pipe를 만든 프로세스의 자식 프로세스
  • 만약 fd[0]에 writing하고 fd[1]에 read하면 어떻게 될까? 바꿔서 사용하게 되면 POSIX에서 규정을 해 놓지 않았기 때문에 오류 코드가 뜨는 건 당연하고 어떤 일이 일어날 지 모른다. 그러므로 바꿔서 쓰지 않도록 주의해야 한다.
  • Pipe를 통해서 read(fd[0])를 하면 조건에 따라 행동이 달라진다.
    • Pipe가 비어있지 않으면(읽을 데이터가 있으면) 즉시 반응한다.
    • Pipe가 비어있고 writing에 열려있으면(fd[1]이 존재하면) pipe에 값이 들어올 때 까지(writing할 때 까지) read를 block한다.
    • Pipe가 비어있고 writing에 닫혀있으면(fd[1]이 존재하지 않으면) 0을 return한다. 이것은 EOF를 만났을 때와 같다.
  • 특별한 경우가 아니면 Pipe는 Blocking I/O를 사용한다.

Pipe를 사용한 Communication

  • Pipe를 한 프로세스에서 사용하는 건 굉장히 비효율적이다.
  • Parent Process에서 Pipe를 만들어 놓은 상태이다.
  • Fork를 통해서 자식 프로세스를 만들면 둘은 같은 Pipe를 공유한다. 이제 이를 통해 정보를 주고 받을 수 있다.

FIFO

  • Pipe는 일시적이다. 왜냐하면 지정하는 이름이 없고 file descriptor를 통해서 접근 가능하기 때문이다.
  • Pipe의 일시적인 특성때문에 Pipe를 open하는 프로세스가 없으면 Pipe는 사라진다.
  • 파일처럼 사용할 수 있는 Pipe도 지원된다. 이를 FIFO 또는 named pipe라고 한다.
  • FIFO는 이름이 있으며 일반 파일처럼 ls 명령어를 통해서도 볼 수 있다.
  • FIFO의 이름을 알고 있고 접근 권한이 있으면 누구든지 FIFO에 연결하여 사용할 수 있다.
#include <sys/stat.h>
int mkfifo(const char *path, mode_t mode); 
  • FIFO는 2가지 방법으로 만들 수 있다.
    • shell에서 mkfifo를 사용하여 만든다.
    • 프로그램에서 mkfifo를 사용하여 만든다.
  • mkfifo 함수는 OS가 FIFO 객체를 지정된 경로에 이름과 함께 만들어 준다. 여기서 중요한 건 Pipe와는 다르게 Open을 해주지 않기 때문에 사용하려면 다른 곳에서 Open을 해주어야 한다.
  • FIFO의 삭제는 일반 파일과 동일하다.
    • shell에서 rm을 사용한다.
    • 프로그램에서 unlink를 사용한다.

profile
다크 모드의 노예

0개의 댓글