fork - 해당되는 글 1건

파이프를생성해서
부모프로세스랑 자식 프로세스랑 통신을한다.
파이프랑 통신을할때 인트형의 파일 디스크립터 공간이 2개할당
하나는 읽기형과 하나는 쓰기 로 쓰인다.
부모자식간에 많이 사용을한다.
파이프를 생성을하고나서 포크를하면 자식 프로세스가된다.

만약전혀 다른 부모자식프로세스가아닌 전혀다른프로세스라면 파이프를 따로따로 호출해주고
서로 의견교환이안된다.
그럴때는 네임드파이프를 사용한다 이름이 있는 파이프사용한다.

부모프로세스가 파이프생성 파이프가 커널영역쪽에서 생성이되고 커널영역에서는 일종에 파일 다루듯이 한다.
파일 디스크립터 넘버를 커널이 반환하면 fork를 이용해서자식프로세서를 생성하면
코드영역은 그대로 공유하고 스택이나 힙같은건 따로할당한다.
자식프로세스는 이때 부모가만들어놓은 파이프도 복사해오기때문에
부모와 자식은 파이프가 공유가 가능하다.

포크를 호출을 해주면 열린프로세스를 가지고 있는게 다 복사가 되기 때문에
자식프로세스도 같은 파일 디스크립터를 가지고 있기 때문에 복사가된다.
fd 0은 읽기용
fd 1은 쓰기용-> 자식이나 부모나 fd0은 읽기용이고 fd1은 쓰기용이다.
파일 디스크립터 넘버가 그대로 복사되는것이기 때문에
오픈대신에 파이프넘버를 받아서 리드나 라이트를 해주면된다.
부모에서는 라이트만하겠다하면 리드용 파일 디스크립트 넘버를 닫아버린다.
자식쪽에서는 쓰기용 으로 쓰기때문에 읽기용은 필요가없다.
==================================================================
/*
 * pipe1.c
 * Written by SW. YOON
 */

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

#define BUFSIZE 30

int main(int argc, char **argv)
{
  int fd[2];
  char buffer[BUFSIZE];
  char msg1[]="Hello Everybody";
  char string[]
  pid_t pid; //프로세스 받아올려고
  int state;

  state = pipe(fd); //파이프를 호출을해서 인자로 2개짜리 배열의 주소를 넣어주면되고
  if(state == -1) { //에프디 배열에 읽기용쓰기용 파일디스크립트 넘버가 반환된다.
    puts("pipe() error");
    exit(1);
  }

  pid = fork();  //파이프가생성된이후에 자식 프로세스가 생성이된다.
//자식프로새스가 생성된후에 피아이디를 봐서 자식프로세스를 생성해준다.


  if(pid == -1){
    puts("fork() error");
    exit(1);
  }
  else if(pid==0){ //0이면은 자식 프로세스
    write(fd[1], "Good\n", 6);
 printf("자식 프로세스 : %s \n", msg1);
  }
  else{ //아니면 부모프로세스
//부모프로세스에서는 굿이 출력된다 자식 프로세스로 부터 메세지를 받아서
    read(fd[0], buffer, BUFSIZE);
    puts(buffer);
  }

  return 0;
}

      네트워크  |  2007. 10. 29. 09:50



sokoban's Blog is powered by Daum & Tattertools