프로세스를 생성하고자 할 때 fork 함수를 사용하면 됩니다.
fork 함수를 호출하는 프로세스는 부모 프로세스가 되고 새롭게 생성되는 프로세스는 자식 프로세스가 됩니다.
fork 함수에 의해 생성된 자식 프로세스는 부모 프로세스의 메모리를 그대로 복사하여 가지게 됩니다.
그리고 fork 함수 호출 이후 코드부터 각자의 메모리를 사용하여 실행됩니다
fork 함수를 사용하기 위해서는 unistd.h를 include하면 됩니다.
fork 함수는 unistd.h 파일에 system call로 정의되어 있습니다.
// unistd.h header file pid_t fork(void); // 성공 시 : 부모 프로세스에서는 자식 프로세스의 PID값을 반환 받음 // 자식 프로세스에서는 0 값을 반환 받음 // 실패 시 : 음수 값(-1) 반환 |
간단한 예제 코드를 살펴 보겠습니다.
#include <stdio.h> #include <unistd.h> int main() { int x; x = 0; fork(); x = 1; printf("PID : %ld, x : %d\n",getpid(), x); return 0; }
실행 결과는 다음과 같습니다.
fork 함수 코드 이후부터는 부모 프로세스와 자식 프로세스가 각자의 x = 1, printf() 코드를 실행하였습니다.
그렇기 때문에 PID 43889(부모 프로세스)에서 x 값은 1을 출력하였고 PID 43895(자식 프로세스)에서도 x 값은 1이라고 출력하였습니다.
PID : 43889, x : 1 PID : 43895, x : 1 |
그림을 통하여 다시 한번 보도록 하겠습니다.
fork 함수가 실행 된 직후에는 자식 프로세스 부모 프로레스와 동일한 주소 공간의 복사본을 가지게 됩니다.
fork 함수 실행 이후 , 부모와 자식 프로세스는 동일한 코드 (x = 1, printf())를 각자 메모리상에서 실행하고 있습니다.
이번에는 fork 함수의 리턴값을 검사하여 부모와 자식 코드를 각각 분리하도록 하겠습니다.
fork 함수는 부모 프로세스에게는 자식프로세스의 PID를 반환하며 자식 프로세스에게는 0을 반환합니다.
#include <stdio.h> #include <unistd.h> #include <sys/types.h> int main() { pid_t pid; int x; x = 0; pid = fork(); if(pid > 0) { // 부모 코드 x = 1; printf("부모 PID : %ld, x : %d , pid : %d\n",(long)getpid(), x, pid); } else if(pid == 0){ // 자식 코드 x = 2; printf("자식 PID : %ld, x : %d\n",(long)getpid(), x); } else { // fork 실패 printf("fork Fail! \n"); return -1; } return 0; }
실행 결과는 다음과 같습니다.
pid 반환값을 검사하여 부모 프로세스와 자식 프로세스에서 실행될 코드를 별도로 작성할 수 있는것을 확인 하였습니다.
부모 PID : 46834, x : 1 , pid : 46838 자식 PID : 46838, x : 2 |
fork 함수가 실행 된 직후에는 자식 프로세스 부모 프로레스와 동일한 주소 공간의 복사본을 가지게 됩니다.
하지만 fork 함수 이후의 코드가 pid값을 기준으로 분리되어 있습니다.
따라서 각 프로세스의 메모리 공간의 x값은 서로 달라지게 됩니다.
지금까지 fork 함수 사용에 대해서 살펴 보았습니다.
'Language > C | C++' 카테고리의 다른 글
waitpid 함수 사용하기(wait함수와 비교) (2) | 2018.03.10 |
---|---|
좀비 프로세스와 고아 프로세스(Zombie process and Orphan process) (0) | 2018.02.07 |
wait 함수 사용하여 자식 프로세스 종료시까지 대기하기 (1) | 2018.02.05 |
exit 함수를 사용하여 프로세스 종료하기 (0) | 2018.02.04 |