포크를 사용하여 C에서 현재 프로그램의 새 프로세스를 만드는 방법

이 게시물에서는 포크를 사용하여 현재 C 프로그램의 새 프로세스를 복제하거나 생성하는 방법을 설명합니다.

이름이 포크인 이유는 무엇입니까?

우리가 자식 프로세스를 만들 때 이 자식 프로세스도 자신의 자식 프로세스를 만들 수 있습니다. 트리와 같은 구조를 형성하므로 포크라는 이름이 붙은 이유일 수 있습니다.

따라서 현재 프로세스의 복제본을 만드는 간단한 프로그램을 작성해 보겠습니다.

#include <stdio.h>
#include <unistd.h> // fork

int main() {
    fork();
    printf("Hello world -> My PID is %d\n", getpid());
    return 0;
}


산출

Hello world -> My PID is 18131
Hello world -> My PID is 18132


그래서 위에서 무슨 일이 일어나고 있는지 설명하겠습니다.

프로그램 실행은 기본 기능에서 시작되며 현재 프로세스의 새 복제본을 생성하는 첫 번째 getfork()과 이제 두 자식 상위 프로세스가 여기에서 계속되고 get 문printf이 있으므로 콘솔에 인쇄합니다.

Note: Whenever program get a fork() statement then at the same instant a clone of it is create and start executing from there only in both the process i.e. Parent and Child.




이 예제를 통해 포크에 대해 자세히 살펴보겠습니다.

#include <stdio.h>
#include <unistd.h> // fork

int main() {
    printf("Program execution start here.\n");
    int r = fork();
    printf(
        "Hello world -> My PID is %d, I am %s process\n", 
        getpid(), 
        r==0 ? "child" : "parent"
    );
    return 0;
}


산출

Program execution start here.
Hello world -> My PID is 548, I am parent process
Hello world -> My PID is 549, I am child process


위에서 무슨 일이 일어나고 있는지 설명하겠습니다.

프로그램 실행이 시작되고 첫 번째 줄printf을 가져오므로 콘솔에 인쇄한 다음 fork 문을 가져오므로 이 줄에 새 자식 프로세스를 만듭니다. 이제 부모 프로그램fork에서는 자식 프로세스의 반환pid이지만 자식 프로세스에서는 0을 반환하므로 반환 값을 확인하고 그에 따라 인쇄합니다.

NOTE: fork() returns -1 if it failed to clone the process.




여기에 하나의 예가 더 있습니다.

#include <stdio.h>
#include <unistd.h> // fork

int main() {
    printf("Program execution start here.\n");

    int r;
    for (int i=0; i<5; i++) {
        if ((r=fork())==0) {
            break;
        }
    }
    printf(
        "Hello world -> My PID is %d, I am %s process\n", 
        getpid(), 
        r==0 ? "child" : "parent"
    );
    return 0;
}


산출

Program execution start here.
Hello world -> My PID is 635, I am child process
Hello world -> My PID is 636, I am child process
Hello world -> My PID is 637, I am child process
Hello world -> My PID is 638, I am child process
Hello world -> My PID is 634, I am parent process
Hello world -> My PID is 639, I am child process


이 프로그램의 출력은 마지막 하위 프로세스 이전의 상위 프로그램 출력으로 이상하게 보입니다. 위의 코드에서 무슨 일이 일어나는지 설명하겠습니다.

루프에서 fork()를 실행하고 응답은 미리 정의된 변수r에 저장됩니다. 따라서 자식 프로세스에서 zero가 되어 자식 프로세스에서 루프가 끊어지고 추가 프로그램이 실행됩니다. 그러나 상위 프로그램 루프에서는 중단되지 않고 계속해서 새로운 하위 프로세스를 생성합니다.

따라서 이러한 자식 프로세스는 CPU에 의해 병렬로 생성되고 실행됩니다. 그러나 마지막 하위 프로세스 루프 생성 후 상위 프로세스에서 명령문 실행printf이 중단되고 계속 실행되기 때문에 하위 프로세스 이후에 마지막 하위 프로세스가 실행됩니다.

그런데 왜 마지막 프로세스가 부모 이후에 실행됩니까?

한 가지 이유는 메모리에 자식 프로세스의 복제본을 만들고 CPU에서 실행하도록 예약하는 데 시간이 걸릴 수 있습니다. 그러나 이미 실행 중인 부모 프로그램이 먼저 실행됩니다.

NOTE: The above reason for execution order may be not accurate. It is just one assumption made by me. So the execution order may vary from machine to machine.



이것이 현재 프로세스를 복제하는 것입니다fork. 위에서 나는 어딘가 틀릴 수 있습니다. 발견하시면 댓글로 적어주세요. 끝까지 읽어주셔서 정말 감사합니다.

요약
  • fork를 사용하여 현재 프로세스를 복제할 수 있습니다.
  • 하위 프로세스의 실행은 fork() 명령문을 얻은 위치에서 시작됩니다. 따라서 하위 프로세스는 거기에서만 실행됩니다.
  • fork는 부모 프로그램에서 생성된 자식 프로세스의 PID를 반환하지만 생성된 자식 프로세스에서는 0를 반환합니다. 따라서 반환 값을 기반으로 논리를 사용하여 자식 프로세스와 부모 프로세스를 구별할 수 있습니다.

  • 이 게시물이 마음에 드셨다면 엄지척 부탁드립니다.

    좋은 웹페이지 즐겨찾기