본문 바로가기

2023년 이전/리눅스

fork() 함수의 사용

1. fork()를 호출했을 때 각 process의 데이터는 따로 나뉘어 저장되기 때문에 global variable인 int x도 마찬가지로 서로 영향을 주지 않습니다.

 

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

void fork1(){
    int x = 1;
    pid_t pid = fork();
    if( pid == 0 ){
        printf("Child has x = %d\n", ++x);
    }
    else{
        printf("Parent has x = %d\n", --x);
    }
    printf("Bye from process %d with x = %d\n", getpid(), x);
}

int main()
{
    fork1();
    return 0;
}

 

출력 결과:

 

 

1. fork() 함수는 child process면 0을, parent process면 0보다 큰 값을 반환합니다.

그러나 이 말은 child process의 ID가 0이 된다는 뜻이 아닙니다.

실제로 위 예시에서 child process 안에서 getpid() 함수를 호출하여 출력했을 때 11203이 나오는 것에서 알 수 있습니다.

그럼 fork() 함수가 리턴하는 값은 어떤 의미를 가지는 걸까요?

fork() 함수의 리턴값이 곧 process의 ID가 되는 건 아니지만, 이 리턴 값을 통해 현재 process가 parent process인지 child process인지를 구별할 수 있습니다. 

 

2. getpid() 함수는 현재 process의 ID를 리턴합니다.

보통 fork()를 통해 child process를 생성하면, child process의 ID는 parent process의 ID + 1 값이 됩니다.

위에서 parent process의 ID는 11202이고 child process의 ID는 11203이 출력되는 것도 그 이유 때문입니다.