C/TCPIP 소켓 프로그래밍(윤성우 저)

TCP/IP 소켓 프로그래밍 11장 내용 확인문제

꾸준함. 2017. 6. 16. 22:58

1. 프로세스간 통신이 의미하는 바는 무엇인가? 이를 개념적으로, 그리고 메모리의 관점에서 각각 설명해보자


>개념적으로 프로세스간 통신은 두 프로세스 사이에서 데이터를 주고 받는 것을 의미한다.

메모리의 관점에서 보면 이는 두 프로세스가 메모리를 공유하는 것으로 이해할 수 있다. 공유하는 메모리의 영역이 존재함으로써 프로세스 상호간에 데이터를 전달할 수 있기 때문이다.


2. 프로세스간 통신에는 IPC라는 별도의 메커니즘이 요구된다. 그리고 이는 운영체제에 의해서 지원되는 별도의 기능이다. 그렇다면 프로세스간 통신에 있어서 이렇듯 운영체제의 도움이 필요한 이유는 무엇인가?


>IPC를 위해서는 공유되는 메모리가 필요한데, 프로세스간에는 메모리를 공유하지 않기 때문에 운영체제의 도움이 필요하다. 즉, 두 프로세스가 동시에 접근 가능한 메모리 영역을 운영체제가 제공해야 한다.


3. 대표적인 IPC 기법으로 '파이프(pipe)'라는 것이 있다. 파이프의 IPC 기법과 관련해서 다음 질문에 답해보자


>

a. 파이프는 프로세스간에 데이터를 송수신하는 경로를 의미한다. 그렇다면 이 경로는 어떻게 해서 생성되며, 누구에 의해 만들어지는가?


->파이프는 pipe 함수의 호출에 의해서 만들어지는데, 이는 운영체제에 의해 생성된다.


b. 프로세스간 통신을 위해서는 통신의 주체가 되는 두 프로세스 모두 파이프에 접근이 가능해야 한다. 그렇다면 하나의 파이프에 두 프로세스는 어떻게 해서 모두 접근이 가능한가?


->pipe 함수호출에 의해 파이프가 생성이 되면, 파이프에 데이터를 입출력 하기 위한 파일 디스크립터 두개가 반환된다. 바로 이 파일 디스크립터를 fork 함수 호출 시 자식 프로세스에게 복사해줘서 부모 프로세스와 자식 프로세스 모두 파이프에 접근할 수 있게 된다.


c. 파이프는 두 프로세스간에 양방향 통신이 가능하게 한다. 그렇다면 양방향 통신을 진행하는데 있어서 특히 주의해야 할 사항은 무엇인가?


->파이프는 프로세스 사이에서의 데이터 흐름을 관리하지 않는다. 따라서 파이프에 데이터가 흘러 들어가면 어느 프로세스건 그 데이터를 읽어들일 수 있다. 결론을 말하자면, 프로세스 사이에서의 데이터 흐름이 어긋나지 않도록 주의해야 한다.(적절한 sleep 함수 호출)


4. IPC 기법을 확인하는 차원에서, 두 프로세스 사이에서 총 3회에 걸쳐서 문자열을 한번씩 주고받는 예제를 작성해보자. 물론 두 프로세스는 부모, 자식의 관계로 형성이 되며, 주고 받을 문자열의 종류는 프로그램상에서 여러분이 임의로 결정하기 바란다.


>

[리눅스 버전]

#include <stdio.h>

#include <string.h>

#include <unistd.h>

#define BUF_SIZE 30

 

int main(int argc, char *argv[])

{

        int fds1[2], fds2[2];

        char str1[] = "Stardew Valley";

        char str2[] = "What about it?";

        char str3[] = "Stardew Valley is a great game";

        char * str_arr[] = { str1, str2, str3 };

        char buf[BUF_SIZE];

        pid_t pid;

 

        pipe(fds1); //파이프

        pipe(fds2);

        pid = fork();

 

        if (pid == 0) //자식 프로세스

        {

               for (int i = 0; i<3; i++)

               {

                       write(fds1[1], str_arr[i], strlen(str_arr[i]) + 1);

                       read(fds2[0], buf, BUF_SIZE);

                       printf("Child proc output: %s \n", buf);

               }

        }

        else //부모 프로세스

        {

               for (int i = 0; i<3; i++)

               {

                       read(fds1[0], buf, BUF_SIZE);

                       printf("Parent proc output: %s \n", buf);

                       write(fds2[1], str_arr[i], strlen(str_arr[i]) + 1);

               }

        }

        return 0;

}

 


[참고] TCP/IP 소켓 프로그래밍 윤성우 저

반응형