Computer Science/유닉스프로그래밍

[유닉스 시스템 프로그래밍] Ch09. 파이프

계속지나가기 2020. 11. 23. 12:58
반응형

(본 강의 노트는 한빛 아카데미의 <유닉스 시스템 프로그래밍> 책을 기반으로 하고 있습니다)

 

학습목표

- 파이프를 이용한 IPC 기법을 이해한다

- 이름 없는 파이프를 이용해 통신 프로그램을 작성할 수 있다

- 이름 있는 파이프를 이용해 통신 프로그램을 작성할 수 있다 

 

목차

1. 파이프의 개념

2. 이름없는 파이프 만들기

3. 복잡한 파이프 생성

4. 양방향 파이프 활용

5. 이름있는 파이프 만들기


1. 파이프의 개념


파이프

- 두 프로세스 간에 통신할 수 있도록 해주는 특수 파일

- 그냥 파이프라고 하면 일반적으로 이름없는 파이프를 의미

- 이름없는 파이프는 부모-자식 프로세스 간에 통신할 수 있도록 해줌

- 파이프는 기본적으로 단방향

2. 이름없는(간단한) 파이프 생성


파이프 생성 : popen()

#include <stdio.h>

FILE *popen(const char *command, const char *mode);

파이프 닫기: pclose()

#include <stdio.h>

int pclose(FILE *stream);

3. 복잡한 파이프 생성


파이프 만들기 : pipe()

#include <unistd.h>

int pipe(int fildes[2]);

- 파이프로 사용할 파일기술자 2개를 인자로 지정

- fildes[0]는 읽기, filedes[1]은 쓰기용 파일 기술자

 

파이프 함수로 통신과정

1. 파이프 함수를 호출하여 파이프로 사용할 파일 기술자 생성

2. fork 함수로 자식 프로세스 생성. pipe도 자식 프로세스로 복사됨

*단, 아래와 같이 파이프 한 방향에서는 read 혹은 write만 일어나야 함(따라서 위 그림보다는 아래 그림이 좀 더 정확)

3. 통신 방향 결정(파이프는 기본적으로 단방향)

 

4. 양방향 파이프 활용


여러 파이프의 활용

양방향 통신

파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다


5. 이름 있는 파이프


이름 있는(named) 파이프

- 부모-자식 간이 아닌 독립적인 프로세스 간에 통신하기 위해서는 이름 있는 파이프 사용

- 이름 있는 파이프는 FIFO라고도 함

- FIFO로 사용할 특수 파일을 명령이나 함수로 먼저 생성해야 함

 

명령으로 FIFO 파일 생성

mknod 명령

: mknod file_name p

mkfifo 명령

: /usr/bin/mkfifo [-m mode] path...

함수로 특수파일 생성

특수 파일 생성 : mknod()

#include <sys/stat.h>

int mknod(const char *path, mode_t mode, dev_t dev);

mode : 생성할 특수파일의 종류 지정

S_IFIFO : FIFO 특수 파일

S_IFCHAR : 문자장치 특수 파일

S_IFDIR : 디렉토리

S_IFDIR : 블록장치 특수파일

S_IFREG : 일반파일

FIFO 파일 생성 : mkfifo()

#include <sys/types.h>
#include <sys/stat.h>

int mkfifo(const char *path, mode_t mode);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형