끄적끄적

반응형

fork() 시스템 콜과 exec() 시스템 콜에 대해 간단히 이야기하고 넘어가겠습니다. UNIX 시스템 프로그래밍을 공부해 보신 분들을 다 잘 아시는 내용일 것입니다.


fork() 나 exec() 모두 한 프로세스가 다른 프로세스를 실행시키기 위해 사용하는 시스템 호출입니다. 두 함수의 차이점을 위주로 설명하면, 우선 fork() 시스템 호출은 새로운 프로세스를 위한 메모리를 할당합니다. 그리고, fork() 를 호출한 프로세스를 새로운 공간으로 싸그리 복사합니다. 그리고 나서 원래 프로세스는 원래 프로세스대로 실행되고, fork() 를 이용해서 생성된 프로세스도 그 나름대로 fork() 시스템 콜이 수행된 라인의 다음 라인부터 실행이 됩니다. (새로 생성된 프로세스는 원래의 프로세스랑 똑같은 코드를가지고 있습니다.) 반면, exec() 시스템 콜은 fork() 처럼 새로운 프로세스를 위한 메모리를 할당하지 않고, exec() 를 호출한 프로세스의 메모리에 새로운 프로세스의 코드를 덮어씌워 버립니다. 따라서 exec() 를 호출한 프로세스가 아닌 exec() 에 의해 호출된 프로세스만 메모리에 남게 됩니다.


다시 간단하게 말하면, fork() 의 결과는 프로세스가 하나 더 생기는 것입니다. 물론, 프로세스 id (pid) 도 완전히 다른 또 하나의 프로세스가 생기는 것이죠. 반면, exec() 실행의 결과로 생성되는 새로운 프로세스는 없습니다. exec() 를 호출한 프로세스의 pid 가 그대로 새로운 프로세스에 적용이 되며, exec() 를 호출한 프로세스는 새로운 프로세스에 의해 덮어쓰여지게 됩니다




#include <stdio.h>

#include <iostream.h>

#include <unistd.h>

#include <sys/wait.h>

void pfork(int a);

int main(){

        int index=0;

        pfork(index);

        return 0;

}

void pfork(int a){

        if(a==10) return;

        else if(fork()==0) {

                printf("Child %d\n",a);

                pfork(a+1);

        }

        else {

                wait(0);

                printf("Parent %d \n", a);

        }

}




< 실행 결과 >

Child 0

Child 1

Child 2

Child 3

Child 4

Child 5

Child 6

Child 7

Child 8

Child 9

Parent 9

Parent 8

Parent 7

Parent 6

Parent 5

Parent 4

Parent 3

Parent 2

Parent 1

Parent 0

반응형
Please Enable JavaScript!
Mohon Aktifkan Javascript![ Enable JavaScript ]