NOTICE 




  

C/C++로 윈도우즈 쪽 개발을 하다 리눅스 쪽으로 오면 적응 안되는 것이 몇가지 있는데 그 중 하나가 fork()함수다. 윈도우즈 쪽에서는 주로 CreateProcess(), CreateTherad() beginthreadex()같은 함수를 사용해서 쓰레드나 프로세스를 다루었는데 유닉스나 리눅스 쪽으로 넘어오니 주로fork()를 이용해서 프로세스를 만들어 사용하고 있었다.

처음에는 사용하는 방법과 개념을 이해하질 못해서 헤맸던 기억이 난다.


fork()는 실행 중인 프로세스의 복사본 프로세스를 생성하는 함수이다. 

주로 실행 중에 별도의 독립된 작업이 필요한 경우 fork()로 복사된 프로세스가 수행하도록 하는 것이 일반적인 사용이다. 


간단한 사용예


#include <stdio.h> // printf, fprintf

#include <unistd.h> // fork


int main()

{

        int pid;


        if((pid = fork()) < 0 ) {

                fprintf(stderr, "folk error\n");

                return -1;

        }


        if(pid==0) {

                printf("I'm child PID=%d\n", getpid());

                printf("My parent is %d\n", getppid());

        }

        else {

                printf("I'm parent PID=%d\n", getpid());

                printf("My child is %d\n", pid);

        }


        return 0;

}



출력 결과


I'm child PID=23793

My parent is 23792

I'm parent PID=23792

My child is 23793



부모 프로세스는 fork()로 자식 프로세스를 생성한 후에 자신의 프로세스ID와 생성한 자식의 프로세스ID를 출력하고 종료한다.

자식 프로세스는 자신의 프로세스ID와 자신을 생성한 부모 프로세스ID를 출력하고 종료한다.


자신이 부모 프로세스인지 자식 프로세스인지를 알려면 fork()의 리턴값을 확인해보면 된다. 

fork()의 리턴값이 0보다 큰 경우(자식 프로세스의 프로세스ID임)에는 자신이 부모프로세스인 경우이고, 0인 경우에는 자신이 자식 프로세스인 경우이다. fork()가 실패한 경우 리턴값은 0보다 작은 값이다.



  
트랙백   |  댓글   |

최근댓글
최근트랙백
fotowall :: ncloud RSS Feeds today :    yesterday :
total :