ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C/C++ vfork(2)
    C,C++ & Linux 2020. 5. 24. 02:21
    728x90

    함수 기능

    자식 프로세스를 생성하되 자식 프로세스가 먼저 실행됨을 보장하는 함수입니다.

     

    vfork() 함수는 자식 프로세스가 exec() 계열의 함수를 호출하는것을 전제로 하고 사용하는 함수입니다.

    vfork() 함수 호출 시 자식 프로세스가 먼저 실행됨을 보장할 뿐만 아니라 _exit() 되거나 exec() 될 때까지 부모 프로세스는 대기합니다.

    fork() 함수와는 달리 메모리를 복사하지 않기 때문에 약간의 성능적 이득이 있습니다.

    다만 exit() 함수를 자식 프로세스에서 호출하게 되면 메모리를 복사하지 않기 때문에 부모 프로세스의 기본 입출력 파일까지 모두 닫아버려서 부모 프로세스는 표준 입출력 파일을 사용할 수 없는 문제가 생기므로 vfork() 로 생성된 자식 프로세스는 _exit() 함수로 프로세스를 종료해야합니다.

     

     

    함수 원형

    #include <unistd.h>
    #include <sys/types.h>
    
    pid_t vfork();

    반환값

    성공 시 부모 프로세스에게는 자식 프로세스의 pid 를 리턴하고 자식 프로세스에게는 0을 리턴함

    에러 시 -1 리턴하고 errno 설정

    예제

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <errno.h>
    
    void ssu_local_func() {
        pid_t pid;
    
        if ((pid = vfork()) == 0)
            printf("자식 프로세스, PID = %d\n", getpid());
        else if (pid > 0)
            sleep(3);
        else
            fprintf(stderr, "error\n");
    }
    
    int main(int argc, char *argv[], char *envpp[]) {
        printf("Before vfork()\n");
        ssu_local_func();
        printf("After ssu_local_func, my PID is %d\n", getpid());
        exit(0);
    }
    

    결과

    vfork() 는 메모리 주소 공간을 부모 자식 프로세스가 공유하기 때문에 자식 프로세스에서 ssu_local_func() 함수를 리턴하게 되면 부모의 Stack 영역에서 ssu_local_func() 함수 영역이 할당 해제되게 됩니다.

    따라서 자식 프로세스가 종료된 이후에 부모 프로세스로 돌아오게되면 비정상 적인 ssu_local_func() 메모리에 접근하게 되므로 부모프로세스는 비정상적으로 종료됩니다.

     

     

     

     

     

     

     

     

     

    리눅스시스템프로그래밍 저자 : 홍지만
    https://book.naver.com/bookdb/book_detail.nhn?bid=14623672

    책에 기술된 예제 프로그램입니다. 책 내부에는 훨씬 더 많은 자료가 있습니다. (개인적으로 좋았습니다.)

    'C,C++ & Linux' 카테고리의 다른 글

    C/C++ waitid(2)  (0) 2020.06.04
    C/C++ wait(2), waitpid(2)  (0) 2020.06.04
    C/C++ fork(2)  (0) 2020.05.24
    C/C++ getpid(2) getppid(2) getuid(2) geteuid(2) getgid(2) getegid(2)  (0) 2020.05.23
    C/C++ setrlimit(2) getrlimit(2)  (0) 2020.05.23

    댓글

Designed by Tistory.