본문 바로가기
dev/c++

[c++] 프로세스 생성 (fork)

by 최연탄 2023. 6. 1.
728x90
반응형

참고: https://www.codespeedy.com/the-fork-system-call-using-cpp/

이 포스트에서는 fork() 시스템 콜이 수행하는 작업과 리눅스 계열 시스템에서 어떻게 구현하는지 예제를 통해 알아보겠습니다.

fork() 시스템 콜 이란?

fork()는 새로운 자식 프로세스를 생성합니다. 부모 프로세스에서 fork()를 호출하면 메모리에 있는 정확한 사본을 다른 위치에 복사합니다. 부모 프로세스와 자식 프로세스 모두 주소 공간이 다르지만 동일한 메모리 세그먼트를 공유합니다.

문법:

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

pid_t fork(void);

fork() 시스템 콜은 생성한 자식 프로세스의 ID를 리턴합니다. 부모와 자식 둘 다 동일한 메모리 세그먼트를 공유하는데 실행 중인 프로세스가 부모인지 자식인지 어떻게 구분할까요? 자식 프로세스에서는 fork()의 리턴 값이 0이고 부모 프로세스에서는 양의 정수를 리턴하므로 이를 통해 구분할 수 있습니다.

부모인지 자식인지 확인하지 않는 예제

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

using namespace std;

int main() {
    fork();

    cout << "Hello, World!" << endl;

    return 0;
}

위의 코드에서는 그냥 fork()를 호출하고 아무런 확인 작업을 하지 않아 결과 화면에서 누가 부모인지 자식인지 구분할 수 없습니다.

부모와 자식을 확인하는 예제

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

using namespace std;

int main() {
    pid_t pid = fork();

    if (pid == 0)
        cout << "Output from the child process." << endl;
    else
        cout << "Output from the parent process." << endl;

    return 0;
}

운영체제가 프로세스를 실행하는 순서를 알 수 없기 때문에 위의 결과 말고도 순서가 바뀌어 나올 수 있습니다. 이 프로그램을 3~4 번 실행해 보면 출력의 차이를 볼 수 있습니다.

fork()를 여러번 하면 프로세스가 몇 개일까?

흥미로운 질문입니다. 우리는 부모 프로세스와 자식 프로세스가 모두 동일한 메모리 세그먼트를 공유한다는 것을 알고 있습니다. 이것이 의미하는 바는 두 프로세스가 동일한 프로그램을 실행하고 있다는 것 입니다. 하지만 유일한 차이점은 자식 프로세스에서 호출된 fork()는 0을 반환한다는 점입니다. 여기서 흥미로운 부분은 하나의 자식 프로세스가 또 다른 자식 프로세스를 만드는 경우입니다. 하나의 프로세스가 자식 프로세스를 만들면 프로세스가 2개가 되기 때문에 fork()를 실행할 수록 프로세스의 갯수는 2의 거듭제곱으로 증가합니다.

다음의 예를 보겠습니다:

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

using namespace std;

int main() {
    fork();
    fork();
    fork();

    cout << "Hello, World!" << endl;

    return 0;
}

관련 글

c++ 프로세스 ID 가져오기 (getpid, getppid)

반응형

댓글