본문 바로가기

컴퓨터 공학 전공/시스템 프로그래밍

Pipe

728x90

Pipe는 IPC의 대표적인 방법 중 하나이다.

IPC는 Inter-Process Communication의 약자로 프로세스 간 서로 sharing을 가능하게 하는 수단을 말한다.

앞으로 IPC의 수단들에 관해 살펴볼 것이지만 제일 먼저 Pipe에 대해 알아보자.

pipe는 두 프로세스 간에 공유하는 하나의 파일이라고 생각하면 쉽다. pipe는 named pipe와 unnamed pipe가 있는데 named pipe는 아예 관계가 없는 독립적인 두 프로세스 간에 IPC를 위해서 사용되고 부모-자식 관계에 있는 경우에는 pipe에 굳이 이름을 붙일 필요가 없으므로 unnamed pipe를 사용한다.

파일에 descriptor가 있는 것처럼 pipe에도 read 전용, write 전용 descriptor가 존재한다. 위와 같이 1번 descriptor는 write 전용이고 0번은 read 전용이다. 예제를 통해 살펴보면 이해가 더욱 쉽다.

pipe(fd)를 하게 되면 fd[0]에 read, fd[1]에 write descriptor가 생성된다. 그럼 자식 프로세스에서와 같이 다른 파일에 읽은 것을 fd[1]을 통해 pipe에 write 할 수도 있고, 부모 프로세스에서와 같이 pipe에 있는 내용을 fd[0]을 통해 read 하여 다른 파일에 write 할 수도 있는 것이다.

여기서 알아두어야 할 함수가 바로 dup과 dup2이다.

int dup(int fd)

dup은 file descriptor를 복제한다고 생각하면 된다. 예를 들어, file descriptor table을 생각해보자. 0, 1, 2번은 기본적으로 stdin, stdout, stderr가 차지하고 있다. 만약 내가 int fd = dup(0)을 하면 fd도 stdin을 가리키게 된다. 그러고 기존의 stdin과 0번 descriptor의 연결을 끊는다면 write(fd, buf, 10)같이 fd을 통해 write 되는 내용들이 표준 입력으로 들어오게 된다. fd의 file descriptor table에서의 위치는 0번부터 시작하여 비어있는 가장 가까운 데에 지정되므로 확인을 해봐야 fd 값을 알 수 있다. (내가 말하면서도 무슨 말인지 다른 사람이 들으면 모를 것 같음…ㅠㅠ)

int dup2(int oldfd, int newfd)

dup2는 dup랑 똑같은데 복제될 fd의 위치를 내가 직접 지정할 수 있다. 만약 지정한 번호가 비어 있지 않으면 강제로 비우고 복제한다. int num = dup(0,100)하면 num에는 100이 들어가고 stdin를 100번 descriptor도 가리키게 되므로 stdin과 동일한 역할을 한다. 그러고 0번 descriptor를 close 하면 write(100, buf, 10)같이 100번 descriptor를 통해 write 된 내용이 표준 입력으로 들어오게 된다.

'컴퓨터 공학 전공 > 시스템 프로그래밍' 카테고리의 다른 글

Memory Mapped File  (0) 2020.04.01
IPC  (0) 2020.04.01
signal  (0) 2020.04.01
record lock  (0) 2020.04.01
fork, wait, exit, exec  (0) 2020.03.31