[c++] C++에서의 프로세스 관리

C++ 프로그래밍에서는 프로세스 관리를 위한 여러 가지 방법을 제공합니다. 이 글에서는 C++를 사용하여 프로세스를 실행, 관리 및 제어하는 방법에 대해 알아보겠습니다.

프로세스 생성

프로세스 제어


프로세스 생성

C++에서 새로운 프로세스를 생성하려면 forkexec과 같은 시스템 호출을 사용할 수 있습니다. POSIX 환경에서는 forkexec 시스템 호출을 이용하여 새로운 프로세스를 생성하고 실행할 수 있습니다. Windows 환경에서는 CreateProcess 함수를 사용하여 새로운 프로세스를 생성할 수 있습니다.

다음은 POSIX 환경에서의 forkexec를 사용한 예시 코드입니다:

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main() {
    pid_t pid = fork();
    
    if (pid == 0) {
        // 자식 프로세스
        execl("/bin/program", "program", NULL);
    } else if (pid > 0) {
        // 부모 프로세스
        wait(NULL);
    } else {
        // fork 실패
    }
    
    return 0;
}

위 예시 코드에서 fork를 사용하여 새로운 자식 프로세스를 생성하고, 자식 프로세스 내에서 execl을 사용하여 새로운 프로그램을 실행하고 있습니다.

프로세스 제어

C++에서는 생성된 프로세스를 제어하고 통신하기 위한 여러 가지 방법이 있습니다. waitwaitpid 함수를 통해 자식 프로세스의 종료를 기다릴 수 있고, kill 함수를 통해 다른 프로세스를 종료시킬 수도 있습니다.

또한 파이프나 소켓을 이용하여 프로세스 간 통신을 할 수도 있습니다. 이를 통해 다른 프로세스와 데이터를 주고받거나 제어할 수 있습니다.

프로세스 간 통신 및 제어에 대한 예시 코드는 다음과 같습니다:

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <iostream>

int main() {
    int pipefd[2];
    pid_t pid;
    char buffer[5];

    pipe(pipefd);  // 파이프 생성

    pid = fork();

    if (pid == 0) {
        // 자식 프로세스
        close(pipefd[1]);  // 쓰기용 파이프 닫기
        read(pipefd[0], buffer, 5); // 파이프로부터 데이터 읽기
        std::cout << "Received: " << buffer << std::endl;
        close(pipefd[0]);  // 읽기용 파이프 닫기
    } else {
        // 부모 프로세스
        close(pipefd[0]);  // 읽기용 파이프 닫기
        write(pipefd[1], "hello", 5); // 파이프로 데이터 쓰기
        close(pipefd[1]); // 쓰기용 파이프 닫기
    }

    return 0;
}

위 예시 코드에서는 파이프를 사용하여 부모 프로세스와 자식 프로세스 간에 데이터를 주고받고 있습니다.


프로세스 생성과 제어는 C++ 프로그램에서 중요한 부분이며, 위에서 설명한 방법들을 통해 프로세스를 생성하고 제어할 수 있습니다. 여러 시스템 호출 및 함수를 조합하여 프로세스 관리를 유연하게 할 수 있습니다.

References