본문 바로가기
책/TCPIP 소켓프로그래밍

11.프로세스 간 통신 (Inter Process Communication)

by 맑은청이 2020. 4. 25.
728x90
반응형

이번 챕터에서는 두개의 프로세스 상호간에 데이터를 주고받는 방법에 대해 알아보겠다. 이는 서버의 구현에 직접적인 연관은 없지만 운영체제를 이해한다는 측면에서도 의미가 있다.

 

프로세스간 통신이 가능 -> 데이터 주고 받음 -> 동시에 접근 가능한 메모리 공간 존재해야함

하지만 프로세스는 서로 완전히 별개의 메모리 공간을 지닌다. 따라서 fork 함수 호출을 통해 생성된 자식 프로세스 조차 부모 프로세스와 메모리 공간을 조금도 공유하지 않는다. 그래서 다른 방법을 통해 이루어질 수 있다.

파이프 기법의 구조적 모델

 

두 프로세스 간의 통신을 위해 파이프라는 것을 생성해야한다. 위 그림처럼 파이프는 프로세스에 속한 것이 아니다. 파이프는 소셋과 마찬가지로 운영체제에 속하는 자원이다->그러므로 fork함수의 복사 대상이 아니다. 이렇게 운영체제가 마련해주는 메모리공간을 통해 통신하게 된다.

 

파이프 생성 함수 

#include <unistd.h>
int pipe(int filedes[2]);
->성공 시 0, 실행 시 -1 반환 

//filedes[0] 파이프로부터 데이터 수신하는 파일 디스크립터 저장, 즉 출구
//filedes[1] 파이프로부터 데이터 전송하는 파일 디스크립터 저장, 즉 입구

결국 부모 프로세스가 pipe 함수를 호출해서 파이프가 생성되고 fork함수는 파일 스크립터가 저장되어 있는 filedesp[2]배열을 복사한다. 파이프를 복사하는 게 아니다. 

 

#include <stdio.h>
#include <unistd.h>
#define BUF_SIZE 30

int main(int argc,char *argv[]){
	int fds[2];
	char str[] = "Who are yow?";
	char buf[BUF_SIZE];
	pid_t pid;

	pipe(fds);
    //파이프 생성, fds에 입출력을 위한 파일 디스크립터 저장
	pid = fork();
	//자식프로세스는 fork 함수 호출를 통해 파일 디스크립터를 소유하게 된다. 
    
	if(pid==0){
		write(fds[1],str,sizeof(str));//파이프로 문자열 전달
	}else{
		read(fds[0],buf,BUF_SIZE);//파이프로 문자열 수신
		puts(buf);
	}
	return 0;
}

파이프 기반의 프로세스간 양방향 통신

파이프 안에 들어가 데이터는 먼저 가져가는 프로세스에게 전달된다. 그러므로 chlild process 본인이 보낸 데이터를 본인이 가져와 버린다. 그러면 Parent 프로세스에서는 입력을 기다리는 꼴이 된다. 이러한 시스템은 거의 불간으에 가깝다. 

 

그럼 어떻게 해야할까?

 

'파이프 두개를 생성하면 된다.

양방향 통신 모델

두 개의 파이프를 이용하면 프로그램의 흐름을 예측하거나 컨트롤 할 필요가 없다.

#include <stdio.h>
#include <unistd.h>
#define BUF_SIZE 30

int main(int argc, char *argv[]){
	int fds1[2],fds2[2];
	char str1[]= "Who are you?";
	char str2[]= "Thank you for your message";
	char buf[BUF_SIZE];
	pid_t pid;

	pipe(fds1);
	pipe(fds2);
	pid = fork();
	if(pid == 0){
		write(fds1[1],str1,sizeof(str1));
		read(fds2[0],buf,BUF_SIZE);
		printf("Child proc output: %s\n",buf);
	}else{
		read(fds1[0],buf,BUF_SIZE);
		printf("Parent proc output: %s\n",buf);
		write(fds2[1],str2,sizeof(str2));
	}
	return 0;
}

 

프로세스와 파이프의 개념으로 복잡한 기능의 서버를 구현하려면 높은 숙련도와 경험이 요구된다. 그래도 공부할만한 가치는 충분히 있다. 

728x90
반응형

' > TCPIP 소켓프로그래밍' 카테고리의 다른 글

14.멀티캐스트&브로드캐스트  (0) 2020.05.04
13.다양한 입출력 함수들  (0) 2020.05.01
12. I/O Multiplexing  (0) 2020.04.28