티스토리 뷰

WHAT?

무엇인가?

pipe에 이름을 지정하여 다른 프로세스에서도 pipe를 사용할 수 있도록 한 것

 

HOW?

어떻게 구현?

- pipe와 다른점은 다른 프로세스간에 통신이 가능하다는 점

1. 프로세스 A -> 프로세스 B로 메세지를 넘길때

프로세스 A에서 FIFO는 WRITE

프로세스 B에서 FIFO는 READ

2. FIFO의 이름을 지정하며 (+mode의 지정) FIFO를 생성해 프로세스간 통신을 할 수 있음

 

 

WHY?

왜 필요한가?

- 멀티프로세스 형태로 서버를 구현하는 경우, 프로세스 사이에 데이터를 주고받을 필요가 있고 이때 프로세스간 IPC가 사용되며 IPC의 한 종류로 FIFO가 있다.

- PIPE의 한계를 극복

: 파이프는 fork()로 만들어진 프로세스간 통신에서만 사용할 수 있는데 FIFO는 pipe에 이름을 지정하여 다른 프로세스에서도 이름을 황용해 파이프에 접근할 수 있도록 한다.

 


1. FIFO의 생성 문법

- mkfifo()함수를 사용

 

int mkfifo(const char *pathname, mode_t mode)

-> pathname에 파이프 이름 지정/ mode를 설정함으로써 같은 모드의 사용자에게 읽고쓰는 권한을 부여

 

2. FIFO를 이용한 에코 서버 프로그램

 

[코드요약]

: FIFO사용시, 이름만 알고 있으면 언제든지 FIFO를 open()을 통해서 사용가능하기때문에 fork()를 하기전에 부모자식 간의 프로세스 사이에서 디스크립터를 통해 사용하는 pipe와 달리, 파이프를 먼저 생성하지 않아도 된다.

나머지는 pipe()의 동작원리와 같으며 mkfifo시 name을 정해주는 것이 핵심이라고 보면 되고 그 name을 fifo를 읽기모드로 open하여 자식프로세스에서 사용하고 name을 쓰기모드로 열어서 부모프로세스에서 사용하는 것을 익히면 됨.

 


FIFO의 한계

FIFO와 PIPE는 모두 프로세스 사이에 스트림을 제공하여 바이트 단위로 전송 순서가 유지되는 통신 채널을 제공한다.

이로인해 데이터를 수신측은 한번에 읽게 되고 경계를 구분하기 어려운 경우가 발생한다.

극복방법

메세지 단위의 송수신을 하기 위해서는 메시지 큐를 사용한다.

'네트워크프로그래밍' 카테고리의 다른 글

세마포어  (0) 2021.05.31
소켓 옵션 변경  (0) 2021.05.27
네트워크 프로그래밍 -PIPE  (0) 2021.05.15
CSMA/CD란?  (0) 2021.04.09
시뮬레이션 [M/M/1 queue]  (0) 2021.03.29