Pipe

Jin·2022년 2월 27일
0

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 된 내용이 표준 입력으로 들어오게 됩니다.

profile
배워서 공유하기

0개의 댓글