Download presentation
Presentation is loading. Please wait.
Published byΜαρία Μαγγίνας Modified 6년 전
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가 화면에 표준 출력하는 내용임
Similar presentations