본문 바로가기

TCP/IP

프로세스간 통신

멀티 프로세스 이용시 문제점

 - 프로세스는 메모리가 독립적으로 존재하기 때문에 메모리를 이용하여
   프로세스간 데이터를 주고 받는 것은 불가능

 - 해결책
   : 서로 독립된 프로세스들이 데이터를 주고받기 위해 운영체제가 ‘파이프’를 제공함

파이프 생성 함수
 - 하나의 파이프 및 파이프에 대한 두 개의 파일 디스크립터가 생성
 - 하나의 파이프를 프로세스들이 공유한다.

#include <unistd.h>
int pipe(int fd[2]);                                 성공시 0, 실패시 -1 리턴


 - fd : 크기가 2인 int형 배열을 요구
 - fd[0] : 함수호출 후 fd[0]에 데이터를 입력받을 수 있는 파일 디스크립터가 담김
   (파이프 출구)
 - fd[1] : 함수호출 후 데이터를 출력할 수 있는 파일 디스크립터가 담김
   (파이프 입구)


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define BUFSIZE 30

int main()
{
  int fd[2];
  char buffer[BUFSIZE];
  pid_t pid;
  int state;

  state = pipe(fd);
  if(state == -1)
  {
    puts("pipe() error");
    exit(1);
  }

  pid = fork();

  if(pid == -1)
  {
    puts("fork() error");
    exit(1);
  }

  else if(pid == 0)
  {
    write(fd[1], "Good\n"7);
  }

  else
  {
    read(fd[0], buffer, BUFSIZE);
    puts(buffer);
  }

  return 0;
}


파이프의 특징
 - 파이프 자체는 fork 함수에 의해 복사되지 않는다.
 - 파이프는 방향성이 존재하지 않는다.


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define BUFSIZE 30

int main(int argc, char *argv[])
{
  int fd[2];
  char buffer[BUFSIZE];
  pid_t pid;
  int state;

  state = pipe(fd);
  if(state == -1)
  {
    puts("pipe() error");
    exit(1);

  }

  pid = fork();
  if(pid == -1)
  {
    puts("fork() error");
    exit(1);
  }

  else if(pid == 0)
  {
    write(fd[1], "Good!"6);
    sleep(2);
    read(fd[0], buffer, BUFSIZE);
    printf("Output of child process : %s \n\n", buffer);
  }

  else
  {
    read(fd[0], buffer, BUFSIZE);
    printf("Output of parent process : %s\n", buffer);
    write(fd[1], "Really Good"12);
    sleep(3);
  }

  return 0;
}


양방향 통신을 위한 파이프 생성
 - 하나의 파이프는 하나의 용도로 사용한다.
   : A 프로세스에서 B 프로세스로 데이터 전송하기 위한 파이프 하나
   : B 프로세스에서 A 프로세스로 데이터 전송하기 위한 파이프 하나


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define BUFSIZE 30

int main(int argc, char *argv[])
{
  int fd1[2], fd2[2];
  char buffer[BUFSIZE];
  pid_t pid;

  if(pipe(fd1) == -1 || pipe(fd2) == -1)
  {
    puts("pipe() error");
    exit(1);
  }

  pid = fork();
  
  if(pid == -1)
  {
    puts("fork() error");
    exit(1);
  }

  else if(pid == 0)
  {
    write(fd1[1], "Good!"6);
    read(fd2[0], buffer, BUFSIZE);
    printf("Output of child process : %s\n\n", buffer);
  }

  else
  {
    read(fd1[0], buffer, BUFSIZE);
    printf("Output of parent process : %s\n", buffer);
    write(fd2[1], "Really good"12);
    sleep(1);
  }
  return 0;
}

'TCP/IP' 카테고리의 다른 글

select 함수  (1) 2011.07.22
멀티플렉싱(multiplexing)  (0) 2011.07.22
양방향 통신(1:1 대화)  (0) 2011.07.19
TCP 클라이언트  (0) 2011.07.07
inet_addr()함수, (=inet_aton)  (0) 2011.07.01