×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 1,281,543명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
강현대 : 5000원(busyhuman)
프로세스 간 네트워크 통신을 통해 인터넷 상의 수많은 개인용 컴퓨터를 연결하는 그리드 컴퓨팅 시스템을 보여주는 예.

프로세스 간 통신(Inter-Process Communication, IPC)이란 프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로를 뜻한다.

주요 IPC 방식[편집]

방식운영 체제 및 기타 환경이 제공
파일대부분의 운영 체제
신호대부분의 운영 체제. 윈도와 같은 일부 시스템은 C 런타임 라이브러리에서만 신호를 제공하며 IPC 방식으로 사용하는 것을 지원하지는 않는다.
소켓대부분의 운영 체제
메시지 큐대부분의 운영 체제
파이프모든 POSIX 시스템, 윈도
지명 파이프모든 POSIX 시스템, 윈도
세마포어모든 POSIX 시스템, 윈도
공유 메모리모든 POSIX 시스템, 윈도
메시지 전달
(비공유)
MPI 패러다임, 자바 RMICORBAMSMQ메일슬롯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


우선 fifoConsumer을 먼저 실행해주자. -> ./fifoConsumer

그 후 fifoProducer을 실행해주자. -> ./fifoProducer

이제 스트링을 입력하여보자.

그러면 fifoConsumer을 실행한 터미널(프로세스)에서 값이 출력되는 것을 알 수 있다.

실제로 너무 간단한 원리이지만 이렇게 파이프를 연결하여 프로세스간 통신을 할 수 있다.