[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;
}
프로세스 간의 데이터 공유와 통신은 각 방법마다 장단점이 있으므로 상황에 맞게 적합한 방법을 선택해야 합니다.