[c++] 프로세스 간 데이터 공유 및 통신 방법

목차


파이프 (Pipe)

파이프는 부모 프로세스와 자식 프로세스 간에 단방향 통신을 제공하는 간단한 방법입니다. 한 프로세스가 파이프에 데이터를 쓰면, 다른 프로세스가 그 데이터를 읽을 수 있습니다.

#include <unistd.h>

int main() {
    int fd[2];
    char buffer[100];

    pipe(fd);

    if (fork() == 0) {
        // 자식 프로세스
        close(fd[1]);
        read(fd[0], buffer, sizeof(buffer));
        // 데이터 처리
        close(fd[0]);
    } else {
        // 부모 프로세스
        close(fd[0]);
        write(fd[1], "Hello, Pipe!", 12);
        close(fd[1]);
    }

    return 0;
}

메시지 큐 (Message Queue)

메시지 큐는 프로세스들 간에 데이터를 주고받을 수 있는 통신 매커니즘입니다. 서로 다른 운영체제 상에서도 효과적으로 동작할 수 있습니다.

#include <mqueue.h>

int main() {
    struct mq_attr attr;
    mqd_t mq;

    attr.mq_flags = 0;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = 1024;
    attr.mq_curmsgs = 0;

    mq = mq_open("/test_queue", O_CREAT | O_RDWR, 0644, &attr);
    mq_send(mq, "Hello, Message Queue!", 22, 0);
    mq_close(mq);
    
    return 0;
}

공유 메모리 (Shared Memory)

공유 메모리는 여러 프로세스가 동일한 물리 메모리 영역을 공유하여 데이터를 교환하는 방식입니다.

#include <sys/ipc.h>
#include <sys/shm.h>

int main() {
    key_t key = ftok("shared_memory", 65);
    int shmid = shmget(key, 1024, 0666|IPC_CREAT);
    char *str = (char*) shmat(shmid, (void*)0, 0);

    // 데이터 쓰기
    sprintf(str, "Hello, Shared Memory!");

    // 공유 메모리 분리
    shmdt(str);
    
    return 0;
}

소켓 (Socket)

소켓은 네트워크 상에서 서로 다른 프로세스 간에 통신을 할 수 있도록 하는 방법입니다.

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>

int main() {
    int sock = socket(AF_INET, SOCK_STREAM, 0);

    struct sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_port = htons(12345);
    
    inet_pton(AF_INET, "127.0.0.1", &server.sin_addr);

    connect(sock, (struct sockaddr *)&server, sizeof(server));

    char message[] = "Hello, Socket!";
    send(sock, message, strlen(message), 0);
    
    close(sock);
    
    return 0;
}

프로세스 간의 데이터 공유와 통신은 각 방법마다 장단점이 있으므로 상황에 맞게 적합한 방법을 선택해야 합니다.