- 이번에는 하나의 파이프를 통해서 두 프로세스가 양방향으로 데이터를 주고 받는 예제를 작성해보고자한다. 이예제에는 보이고자 하는 통신방식은 다음과 같다.
- 위그림과 같이 하나의 파이프를 대상으로 양방향으로 통신을 하는 것도 물론 가능하다 하지만이러한 모델로 구현할 경우 몇 배는 더 주의해야한다.
- pipe2.c 예제
#include <stdio.h>
#include <unistd.h>
#define BUF_SIZE 30
int main(int argc, char *argv[])
{
int fds[2];
char str1[] = "Who are you";
char str2[] = "Thank you for your message";
char buf[BUF_SIZE];
pid_t pid;
// pipe 함수호출을 통해서 파이프를 생성하고 있다.
// 이로 인해서 배열 fds에는 입출력을 위한 파일디스크립터가 각각 저장된다.
pipe(fds);
// 이어서 fork함수를 호출하고 있다. 따라서 자식 프로세스는 12행의 함수호출을
// 통해서 얻게된 두 개의 파일 디스크립터를 함께 함께 소유하게 된다. 주의하라!
// 파이프가 복사된것이 아니라 파이프의 입출력에 사용되는 파일 디스크립터가
// 복사된 것이다. 이로써 부모와 자식 프로세스가 동시에 입출력 파일 디스크립터를 모두
// 소유하게 되었다
pid = fork();
if(pid == 0)
{
// 자식프로세스는 이 라인의 실행을 통해서 파이프로 문자열을 전달한다.
write(fds[1], str1, sizeof(str1));
sleep(2);
read(fds[0], buf, BUF_SIZE);
printf("Child proc output: %s \n", buf);
}
else
{
// 그리고 부모 프로세스는 이 라인의 실행을 통해서 파이프로 부터 문자열을
// 수신한다.
read(fds[0], buf, BUF_SIZE);
printf("Parent proc output: %s \n", buf);
write(fds[1], str2, sizeof(str2));
sleep(3);
}
return 0;
}
- 실행결과가 여러분의 예상과 일치함을 알 수 있다 그렇다면 이번에는 18행을 주석처리하고 실행해보자 (반드시 직접 실행해서 결과를 확인해야 한다) 단지 자식 프로세스의 실행시간을 2초정도 늦추는 코드일 뿐인데 실행결과에서 문제가 발생했음을 확인할 수 있다. 그렇다면 무엇 때문에 문제가 발생한것일까?
- "파이프에 데이터가 전달되 먼저 가져가는 프로세스에게 이 데이터가 전달된다. "
- 쉽게 말해서 파이프에 데이터가 들어가면 이는 임자가 없는 데이터가 된다. 즉 read함수호출을 통해서 먼저 데이터를 읽어 들이는 프로세스에게 데이터가 전달된다. 그것이 비록 파이프에 데이터를 가져다 놓은 프로세스라 하더라도 말이다 그래서 위 예제의 18ㅐㅇ을 주석처리하면 문제가 되는 것이다. 17행 에서 파이프에 전달한데이터를자식 프로세스 본인이 19행에서 다시 가져가버리기 때문이다 ㅕㄹ국 부모 프로세스는 read함수를 호출하고 나서 파이프에 데이터가 들어오기만을 기다리는 꼴이 된다. 위의 예제에서 보이듯이 오직 하나의 파이프만 가지고 양방향으로 데이터를 송수신하는것은 쉬운 일이 ㅏ니다 이를 위해서는 프로그램의 실행흐름을 예측하고 컨트롤해야하는데 이는 시스템에 따라서 달라져야하는 부분이기 때문에 사실상 불가능한 일로 간주하는 것이 옳다 그렇다면 어떻게 해야 양방향으로 데이터를 송수신할 수 있겠는가?
- "파이프 두개 생성하면 됩니다."
- 어렵게 생각할것없다. 파이프를 반드시하나만 생성해야 ㅏ는것은 아니기 떄문이다. 따라서 다음 그림에서 보이듯이 두 개의 파이프를 생성해서 각각이 서로 다른 데이터의 흐름을 담당하게 하면된다.
- 위 그림에서 보이듯 두 개의 파이프를 이용하면 프로그램의흐름을 예측하거나 컨트롤할 필요가 없다.
'책 > 윤성우 TCPIP' 카테고리의 다른 글
12 IO 멀티플렉싱(Multiplexing) (0) | 2020.12.27 |
---|---|
11-01 프로세스간 통신의 기본 개념 (3) ~ 11-02 프로세스간 통신의 적용 (0) | 2020.12.26 |
11-01 프로세스간 통신의 기본 개념 (1) (0) | 2020.12.24 |
10-05 TCP의 입출력 루틴(Routine)분할 (2) (0) | 2020.12.23 |
10-05 TCP의 입출력 루틴(Routine)분할 (0) | 2020.12.22 |