Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
04-29 12:47
관리 메뉴

nomad-programmer

[Programming/C] fork() 함수 본문

Programming/C

[Programming/C] fork() 함수

scii 2020. 6. 19. 17:55

exec() 함수를 호출하면 새로운 프로그램을 실행해 현재 함수를 대체한다. 그러면 원래 프로그램은 곧바로 종료된다.

fork()는 프로세스를 복제한다. fork()는 현재 프로세스의 완전한 사본을 만든다. 새로 만든 사본은 똑같은 프로그램을 똑같은 위치에서 실행한다. 똑같은 변수를 갖고 있고 변수 안에 들어 있는 값도 똑같다. 단 하나 차이점이라면 사본 프로세스의 PID가 원래 프로세스와 다르다는 것이다.

원래 프로세스는 "부모 프로세스"라고 하며, 새로 생성된 사본은 "자식 프로세스"라고 부른다.

리눅스 및 맥과는 달리 윈도우는 기본적으로 fork()를 지원하지 않는다.

프로세스는 누가 부모이고 누가 자식인지 알 수 있는 방법이 필요하다. 따라서 fork() 함수는 자식 프로세스에는 0을, 부모 프로세스에는 0이 나닌 값을 반환한다.

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    for (int i = 0; i < 3; i++) {
        // fork()는 자식 프로세스에는 0을 반환
        // 부모 프로세스에는 0이 아닌 양의 값을 반환
        // fork()가 -1을 반환하면 프로세스를 복제하는 데 실패했다는 의미
        pid_t pid = fork();
        if (pid == -1) {
            fprintf(stderr, "프로세스 포크 실패: %s\n", strerror(errno));
            return 1;
        }
        // 이것은 if (pid == 0)과 같다.
        // fork()가 0을 반환하면 코드가 자식 프로세스에서 실행되고 있다는 것이다.
        // 즉, 자식 프로세스가 아래의 명령을 실행한다.
        if (!pid) {
            if (execlp("gnome-terminal", "gnome-terminal",  NULL) == -1) {
                fprintf(stderr, "실행 명령어가 없다 %s\n", strerror(errno));
                return 1;
            }
        }
    }

    return 0;
}

// 결과
/*

터미널을 3개 띄운다.

*/
모든 프로세스가 모두 동시에 실행된다.

 

Comments