목차
개요
IPC 즉 프로세스간 통신의 한 종류인 파이프에 대해서 알아보자
먼저 파이프는 두 종류가 있는데 익명 파이프와 지명 파이프로 나뉘어져있다.
파이프를 구현하는데에는 여러가지 옵션을 고려해야하는데
- 단방향 통신인가? 양방향 통신인가?
- 양방향인 경우에는 반이중 방식인가? 전이중 방식인가?
- 두 프로세스 간에 부모-자식 같은 특정 관계가 존재하는가?
이번 포스팅에서는
단방향 통신만이 가능하고 부모-자식 관계에서만 동작하는 익명 파이프에 대해 알아보겠다.
지명 파이프에 대해서도 궁금하다면 ⬇⬇⬇
2022.09.21 - [분류 전체보기] - 프로세스 :: 지명 파이프(named pipes)
개념 및 특징
두 프로세스가 통신할 수 있게 하는 전달자로서 프로세스간의 통신을 허용한다.
위에서 기술했다싶이 단방향 통신만을 허용하고 있어서 한쪽으로는 데이터 전송만이 가능하고 반대에는 데이터를 수신만이 가능하다. 따라서 양방향 통신이 필요한 경우에는 두개의 파이프를 만들어서 각각 송수신이 가능한 형태로 구현을 해야한다.
또한 파이프를 생성한 프로세스 이외에는 접근이 불가능하다. 따라서 대부분 부모-자식간의 프로세스와 통신에 의해 사용된다. 부모에서 fork() 를 통해 생성된 자식 프로세스의 특징 상 자식 프로세스에도 파일의 특수형태인 파이프가 상속되어진다. 아래 생성 원리에서 더 자세히 알아보자
생성 원리
위의 포스팅에서 파이프는 파일의 특수형태라고 잠깐 기술했었는데 이에 더해 일반 파이프가 구축되는 과정을 잠깐 설명하자면
FD(파일 디스크립터) 라는 것을 이용하여 파이프를 생성하게 되는데
FD에 대해서 알아보려면 ⬇⬇⬇
파일 디스크립터의 0~2까지는 각 stdin stdout stderr 가 할당되어있고 3과 4에 파이프를 통한 통신을 위한 (굳이 3 4 가 아니어도 접근이 유효한 번호) 읽기 엔드(readable end)와 쓰기 엔드(writable end) 가 pipe() 함수의 호출에 의하여 생성된다.
이렇게 생성된 각 엔드에 파이프가 연결되게 된다. 이후에는 자식 프로세스를 생성하기 위해 fork()를 하게 되는데 이때 자식은 부모가 가진 fd를 상속받기 때문에 (STARTUPINFO 구조체의 인스턴스를 위한 핸들) 자식한테도 읽기 엔드와 쓰기 엔드가 할당되게 된다.
그럼 각각 읽기 엔드와 쓰기 엔드 모두 존재하게 됨으로 부모가 정보를 보낼때는 읽기 엔드를 닫고 쓰기엔드에 데이터를 써서 보내면 자식프로세스는 데이터를 받기 위해서 쓰기 엔드를 닫고 읽기엔드를 통해 데이터를 받게 된다.
일단 파이프의 원리를 이해를 했으니 더 깊은 LINUX의 원리로 들어가자면
자식 프로세스는 dup2()함수를 호출해서 stdin 이 할당 되었던 fd[0] 을 close() 하고 fd[0] 자리에 읽기 엔드를 복사하여 데이터를 받을 준비를 한다.
그리고 부모 프로세스가 쓰기 엔드를 이용하여 데이터를 파이프에 전송하면 역할을 다한 부모프로세스의 쓰기 엔드도 close() 하고 EOF가 전송되게 된다.
그럼 자식프로세스는 받은 입력을 stdout을 통하여 정렬하여 터미널로 전송을 하고 전송이 끝났다는 시그널을 부모프로세스가 받게되면 부모와 자식 프로세스 모두 파이프 통신에 이용되었던 fd 들을 close() 하여 통신을 끝낸다.
또한 두 파이프 모두 동일한 기계 내에 존재해야한다는 조건이 있다. 다른 기계에 존재하는 IPC를 하기 위해서는 소켓 통신 방식을 사용해야한다.
'CS > Operating System' 카테고리의 다른 글
프로세스 :: 지명 파이프(named pipes) (0) | 2022.09.22 |
---|---|
프로세스 :: 버퍼(Buffer), 버퍼링(Buffering) (0) | 2022.09.06 |
프로세스 :: 메시지 전달 시스템 at Mach(iOS) (0) | 2022.08.31 |
프로세스 :: 공유 메모리 시스템 at POSIX (0) | 2022.08.31 |
프로세스 :: 프로세스 간 통신(IPC) 개념, 종류 (0) | 2022.08.29 |