양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다.
[예제 9-5] 양방향 통신하기(test1.c) ... 07 int main(void) { 08 int fd1[2], fd2[2]; 09 pid_t pid; 10 char buf[257]; 11 int len, status; 12 13 if (pipe(fd1) == -1) { 14 perror("pipe"); 15 exit(1); 16 } 17 18 if (pipe(fd2) == -1) { 19 perror("pipe"); 20 exit(1); 21 } 22 23 switch (pid = fork()) { 24 case -1 : 25 perror("fork"); 26 exit(1); 27 break; 파이프 2개를 생성하기위해 배열2개 선언 파이프 2개 생성
[예제 9-5] 양방향 통신하기(test1.c) 28 case 0 : /* child */ 29 close(fd1[1]); 31 write(1, "Child Process:", 15); 32 len = read(fd1[0], buf, 256); 33 write(1, buf, len); 34 35 strcpy(buf, "Good\n"); 36 write(fd2[1], buf, strlen(buf)); 37 break; 38 default : 39 close(fd1[0]); 40 close(fd2[1]); 41 buf[0] = '\0'; 42 write(fd1[1], "Hello\n", 6); 43 44 write(1, "Parent Process:", 15); 45 len = read(fd2[0], buf, 256); 46 write(1, buf, len); 47 waitpid(pid, &status, 0); 48 break; 49 } 50 51 return 0; 52 } 자식 프로세스 fd1[0]으로 읽기 fd2[1]로 쓰기 부모 프로세스 fd1[1]로 쓰기 fd2[0]으로 읽기 # ex9_5.out Child Process:Hello Parent Process:Good
파이프를 두 개 생성하여 다음과 같이 동작하도록 프로그램 하라 실습 파이프를 두 개 생성하여 다음과 같이 동작하도록 프로그램 하라 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)
이름 있는 파이프[1] 이름 있는 파이프 명령으로 FIFO 파일 생성 부모-자식간이 아닌 독립적인 프로세스 간에 통신하기 위해서는 이름 있는 파이프 사용 이름 있는 파이프는 FIFO라고도 함 FIFO로 사용할 특수파일을 명령이나 함수로 먼저 생성해야함 명령으로 FIFO 파일 생성 mknod 명령 mkfifo명령 mknod 파일명 p # mknod HAN_FIFO p # ls -l HAN_FIFO prw-r--r-- 1 root other 0 2월 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-- 1 root other 0 2월 13일 12:28 BIT_FIFO
이름 있는 파이프[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);
[예제 9-7] FIFO로 데이터 주고 받기 –서버(server.c) ... 08 int main(void) { 09 int pd, n; 10 char msg[] = "Hello, FIFO"; 11 12 printf("Server =====\n"); 13 14 if (mkfifo("./HAN-FIFO", 0666) == -1) { 15 perror("mkfifo"); 16 exit(1); 17 } 18 19 if ((pd = open("./HAN-FIFO", O_WRONLY)) == -1) { 20 perror("open"); 21 exit(1); 22 } 23 24 printf("To Client : %s\n", msg); 25 26 n = write(pd, msg, strlen(msg)+1); 27 if (n == -1) { 28 perror("write"); 29 exit(1); 30 } 31 close(pd); 32 33 return 0; 34 } FIFO 파일 생성 FIFO 파일 쓰기모드로 열기 FIFO 파일에 문자열 출력
[예제 9-7] FIFO로 데이터 주고 받기 –클라이언트(client.c) ... 08 int main(void) { 07 int pd, n; 08 char inmsg[80]; 09 10 if ((pd = open("./HAN-FIFO", O_RDONLY)) == -1) { 11 perror("open"); 12 exit(1); 13 } 14 15 printf("Client =====\n"); 16 write(1, "From Server :", 13); 17 18 while ((n=read(pd, inmsg, 80)) > 0) 19 write(1, inmsg, n); 20 21 if (n == -1) { 22 perror("read"); 23 exit(1); 24 } 25 26 write(1, "\n", 1); 27 close(pd); 28 29 return 0; 30 } 서버측에서 생성한 FIFO 파일열기 # server Server ===== To Client : Hello, FIFO # 서버가 보낸 데이터 읽기 # client Client ===== From Server :Hello, FIFO #
이름 있는 파이프[2] (P378) O_NONBLOCK O_NONBLOCK이 설정되어 있지 않으면 다른 프로세스가 읽기 위해 열 때까지 쓰기 위한 open 함수는 블록. 반대의 경우도 마찬가지임 O_NONBLOCK이 설정되어 있으면 봉쇄대신 -1을 return, errno는 ENXIO를 가짐 sendmessage.c, rcvmessage.c ./rcvmessage & ./sendmessage ‘message 1’ ‘message 2’
Client와 serve와의 간단한 대화형 프로그램을 작성하라 실습 Client와 serve와의 간단한 대화형 프로그램을 작성하라 client가 표준 입력한 내용을 server가 화면에 표준 출력하는 내용임