[c++] 리눅스 환경에서의 C++ 프로세스 간 통신 기법

리눅스 환경에서 프로세스 간 통신을 위해 다양한 기법들이 제공됩니다. 이 기술 블로그에서는 C++ 언어와 리눅스 환경에서 주로 사용되는 몇 가지 프로세스 간 통신 기법에 대해 알아보겠습니다.

목차

  1. 파일을 이용한 통신
  2. 파이프를 이용한 통신
  3. 소켓을 이용한 통신

파일을 이용한 통신

프로세스 간 통신을 위해 파일을 사용하는 방법은 간단하고 효과적인 방법입니다. 한 프로세스가 다른 프로세스에게 데이터를 전달하기 위해 파일을 생성하고, 데이터를 해당 파일에 씁니다. 그리고 수신측 프로세스는 해당 파일을 읽어서 데이터를 가져옵니다.

간단한 C++ 코드를 통해 파일을 이용한 통신을 구현할 수 있습니다.

#include <iostream>
#include <fstream>

int main() {
    std::ofstream file("communication.txt");
    file << "Hello, inter-process communication!";
    file.close();

    return 0;
}

위 코드는 텍스트 파일을 생성하고 “Hello, inter-process communication!”을 파일에 씁니다.


파이프를 이용한 통신

리눅스 환경에서는 파이프를 사용하여 프로세스 간 양방향 통신이 가능합니다. 파이프는 부모 프로세스와 자식 프로세스 간에만 사용할 수 있기 때문에 특정한 상황에서만 사용됩니다.

다음은 C++을 사용한 간단한 파이프 통신 예제입니다.

#include <iostream>
#include <unistd.h>

int main() {
    int pipefd[2];
    char buffer[20];
    pipe(pipefd);

    if (fork() == 0) {
        write(pipefd[1], "Hello, pipe!", 12);
    } else {
        read(pipefd[0], buffer, 12);
        std::cout << "Received message: " << buffer << std::endl;
    }

    return 0;
}

위 코드는 파이프를 통해 “Hello, pipe!”라는 메시지를 전송하고, 수신측에서 이를 읽어옵니다.


소켓을 이용한 통신

소켓을 이용한 통신은 네트워크 프로그래밍에 많이 사용되지만, 로컬 머신에서의 프로세스 간 통신에도 활용될 수 있습니다. 소켓은 통신을 위한 IP 주소와 포트를 바탕으로 통신을 수행합니다.

C++과 리눅스 환경에서 소켓을 이용한 프로세스 간 통신을 위한 예제 코드는 다음과 같습니다.

// server.cpp
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

int main() {
    int server_fd, new_socket, valread;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};

    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    // ...

    return 0;
}
// client.cpp
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

int main() {
    int sock = 0, valread;
    struct sockaddr_in serv_addr;
    char buffer[1024] = {0};

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("Socket creation error\n");
        return -1;
    }

    // ...

    return 0;
}

위 코드는 서버와 클라이언트 간의 간단한 소켓 통신 예제입니다.

결론

리눅스 환경에서의 C++ 프로세스 간 통신 기법에는 파일을 이용한 통신, 파이프를 이용한 통신, 소켓을 이용한 통신 등 다양한 방법이 있습니다. 각 방법은 상황에 따라 선택되어야 하며, 프로세스 간 안전하고 빠른 통신을 위해 적절한 기법을 선택하는 것이 중요합니다.

참고 자료:

위의 예제 및 코드는 간략한 설명을 위한 것으로, 실제 프로세스 간 통신에 사용될 경우 보다 신중한 접근이 필요합니다.