Presentation is loading. Please wait.

Presentation is loading. Please wait.

양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다.

Similar presentations


Presentation on theme: "양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다."— Presentation transcript:

1 양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다.

2 [예제 9-5] 양방향 통신하기(test1.c) ... 07 int main(void) {
int fd1[2], fd2[2]; pid_t pid; char buf[257]; int len, status; 12 if (pipe(fd1) == -1) { perror("pipe"); exit(1); } 17 if (pipe(fd2) == -1) { perror("pipe"); exit(1); } 22 switch (pid = fork()) { case -1 : perror("fork"); exit(1); break; 파이프 2개를 생성하기위해 배열2개 선언 파이프 2개 생성

3 [예제 9-5] 양방향 통신하기(test1.c) 28 case 0 : /* child */ 29 close(fd1[1]);
write(1, "Child Process:", 15); len = read(fd1[0], buf, 256); write(1, buf, len); 34 strcpy(buf, "Good\n"); write(fd2[1], buf, strlen(buf)); break; default : close(fd1[0]); close(fd2[1]); buf[0] = '\0'; write(fd1[1], "Hello\n", 6); 43 write(1, "Parent Process:", 15); len = read(fd2[0], buf, 256); write(1, buf, len); waitpid(pid, &status, 0); break; } 50 return 0; 52 } 자식 프로세스 fd1[0]으로 읽기 fd2[1]로 쓰기 부모 프로세스 fd1[1]로 쓰기 fd2[0]으로 읽기 # ex9_5.out Child Process:Hello Parent Process:Good

4 파이프를 두 개 생성하여 다음과 같이 동작하도록 프로그램 하라
실습 파이프를 두 개 생성하여 다음과 같이 동작하도록 프로그램 하라 first-p child -> parent (3개의 message) “hello, world #1/#2/#3 (child->parent) 표준출력 second-p parent -> child (3개의 message) “hello, world #1/#2/#3 (parent->child)

5 이름 있는 파이프[1] 이름 있는 파이프 명령으로 FIFO 파일 생성
부모-자식간이 아닌 독립적인 프로세스 간에 통신하기 위해서는 이름 있는 파이프 사용 이름 있는 파이프는 FIFO라고도 함 FIFO로 사용할 특수파일을 명령이나 함수로 먼저 생성해야함 명령으로 FIFO 파일 생성 mknod 명령 mkfifo명령 mknod 파일명 p # mknod HAN_FIFO p # ls -l HAN_FIFO prw-r--r root other 월 13일 12:21 HAN_FIFO # ls -F HAN_FIFO| FIFO 표시 /usr/bin/mkfifo [-m mode] path… # mkfifo -m 0644 BIT_FIFO # ls -l BIT_FIFO prw-r--r root other 월 13일 12:28 BIT_FIFO

6 이름 있는 파이프[2] 함수로 특수파일 생성 특수파일생성: mknod(2) #include <sys/stat.h>
mode : 생성할 특수파일의 종류 지정 S_IFIFO : FIFO 특수 파일 S_IFCHAR : 문자장치 특수 파일 S_IFDIR : 디렉토리 S_IFDIR : 블록장치 특수파일 S_IFREG : 일반파일 FIFO 파일 생성: mkfifo(3) mode : 접근권한 지정 #include <sys/stat.h> int mknod(const char *path, mode_t mode, dev_t dev); #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *path, mode_t mode);

7 [예제 9-7] FIFO로 데이터 주고 받기 –서버(server.c)
... 08 int main(void) { int pd, n; char msg[] = "Hello, FIFO"; 11 printf("Server =====\n"); 13 if (mkfifo("./HAN-FIFO", 0666) == -1) { perror("mkfifo"); exit(1); } 18 if ((pd = open("./HAN-FIFO", O_WRONLY)) == -1) { perror("open"); exit(1); } 23 printf("To Client : %s\n", msg); 25 n = write(pd, msg, strlen(msg)+1); if (n == -1) { perror("write"); exit(1); } close(pd); 32 return 0; 34 } FIFO 파일 생성 FIFO 파일 쓰기모드로 열기 FIFO 파일에 문자열 출력

8 [예제 9-7] FIFO로 데이터 주고 받기 –클라이언트(client.c)
... 08 int main(void) { int pd, n; char inmsg[80]; 09 if ((pd = open("./HAN-FIFO", O_RDONLY)) == -1) { perror("open"); exit(1); } 14 printf("Client =====\n"); write(1, "From Server :", 13); 17 while ((n=read(pd, inmsg, 80)) > 0) write(1, inmsg, n); 20 if (n == -1) { perror("read"); exit(1); } 25 write(1, "\n", 1); close(pd); 28 return 0; 30 } 서버측에서 생성한 FIFO 파일열기 # server Server ===== To Client : Hello, FIFO # 서버가 보낸 데이터 읽기 # client Client ===== From Server :Hello, FIFO #

9 이름 있는 파이프[2] (P378) O_NONBLOCK
O_NONBLOCK이 설정되어 있지 않으면 다른 프로세스가 읽기 위해 열 때까지 쓰기 위한 open 함수는 블록. 반대의 경우도 마찬가지임 O_NONBLOCK이 설정되어 있으면 봉쇄대신 -1을 return, errno는 ENXIO를 가짐 sendmessage.c, rcvmessage.c ./rcvmessage & ./sendmessage ‘message 1’ ‘message 2’

10 Client와 serve와의 간단한 대화형 프로그램을 작성하라
실습 Client와 serve와의 간단한 대화형 프로그램을 작성하라 client가 표준 입력한 내용을 server가 화면에 표준 출력하는 내용임


Download ppt "양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다."

Similar presentations


Ads by Google