프로세스 간 통신(Inter-Process Communication, IPC)이란 프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로를 뜻한다.
주요 IPC 방식[편집]
방식 | 운영 체제 및 기타 환경이 제공 |
---|---|
파일 | 대부분의 운영 체제 |
신호 | 대부분의 운영 체제. 윈도와 같은 일부 시스템은 C 런타임 라이브러리에서만 신호를 제공하며 IPC 방식으로 사용하는 것을 지원하지는 않는다. |
소켓 | 대부분의 운영 체제 |
메시지 큐 | 대부분의 운영 체제 |
파이프 | 모든 POSIX 시스템, 윈도 |
지명 파이프 | 모든 POSIX 시스템, 윈도 |
세마포어 | 모든 POSIX 시스템, 윈도 |
공유 메모리 | 모든 POSIX 시스템, 윈도 |
메시지 전달 (비공유) | MPI 패러다임, 자바 RMI, CORBA, MSMQ, 메일슬롯, QNX 등에 쓰임 |
메모리 맵 파일 | 모든 POSIX 시스템, 윈도 |
출처 :: https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4_%EA%B0%84_%ED%86%B5%EC%8B%A0
이중 이번에는 파이프를 이용한 통신을 직접 코딩해보고자 한다.
우선 코드를 작성하기 전에
서버는 Producer 즉, 데이터를 제작해서 전송하는 단위이고, 클라이언트 Consumer 즉, 데이터를 받아오는 단위이다.
이 코드의 로직은 서버가 데이터를 만들어 전송하면 클라이언트가 데이터를 인지하여 가져오는 방식이다.
아래 fifoProducer.c를 제작한다.
이 파일의 의미는 다음과 같다.
tmp위치의 fifoText를 만들어내고 O_WRONLY로 쓰기 전용으로 만드는데 만약 Consumer이 따로 없다면 O_NONBLOCK로 idle상태를 막아준다.
그리고 fifoText에 데이터를 write를 해준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> int main(){ int fp; printf("String to send :: "); // now text limit -> 10 char input[10]; scanf("%9s", input); if((fp = open("/tmp/fifoText", O_WRONLY | O_NONBLOCK)) < 0){ printf("file open error\n"); return -1; } write(fp, input, 10); close(fp); return 0; } | cs |
이번에는 Consumer에 해당하는 fifoConsumer.c 를 제작한다.
만약 이전 fifoText가 있다면 삭제해주고 새로이 tmp에 fifoText를 만들어준다.
그리고 O_RDONLY는 읽기전용의 의미로써 파일을 열고 read를 무한으로 반복하여 파일에 새로운 값이 들어올 때마다 읽어준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <string.h> #define BUFF_SIZE 100 int main(){ int value, fp; char buf[BUFF_SIZE] = {0,}; // remove old fifo file system("rm /tmp/fifoText -f"); // make new fifo file if(mkfifo("/tmp/fifoText", 0666) != 0) { printf("create fifo failed\n"); return -1; } if((fp=open("/tmp/fifoText", O_RDONLY)) < 0) { printf("open fifo failed\n"); return -1; } while(1) { if((value = read(fp, buf, BUFF_SIZE)) > 0) { printf("new fifo message arrived : %s\n", buf); } } return 0; } | cs |
이 파일 두개를 다음과 같이 컴파일하자.
gcc fifoProducer.c -o fifoProducer
gcc fifoConsumer.c -o fifoConsumer
'Applied > Network' 카테고리의 다른 글
HTTP 상태 코드 정리 (0) | 2018.09.30 |
---|---|
HTTP 리퀘스트 메시지 (0) | 2018.09.27 |
OSI 7계층(Open System Interconnection 7 Layer) (0) | 2017.12.06 |
Broker, Publisher, Subscriber 네트워크 통신 제작 (0) | 2016.12.31 |
네트워크 통신 프로그래밍 용어 및 설명 정리 - (3) (0) | 2016.12.09 |