EASY7

자식 프로세스와 fork 함수 본문

보안 공부/다양한 지식

자식 프로세스와 fork 함수

E.asiest 2021. 7. 18. 13:31

고아 프로세스

부모 프로세스가 자식 프로세스보다 먼저 종료되면 고아 프로세스가 된다. 

init 프로세스(PID:1)이 자식 프로세스의 새로운 부모 프로세스가 된다. 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>


int main() {
     
    pid_t childPid;
    int i;
     
    childPid = fork();
     
    if(childPid > 0) {  // 부모 프로세스
        printf("부모 PID : %ld, pid : %d\n",(long)getpid(), childPid);
        sleep(2);
        printf("부모 종료\n");
        exit(0);
    }
    else if(childPid == 0){  // 자식 코드
        printf("자식 시작\n");
         
        for(i=0;i<10;i++) {
            printf("자식 PID : %ld 부모 PID : %ld\n",(long)getpid(), (long)getppid());
            sleep(1);
        }
         
        printf("자식 종료\n");
        exit(0);
    }
    else {  // fork 실패
        perror("fork Fail! \n");
        return -1;
    }
     
    return 0;
}

결과 : 

부모 PID : 22, pid : 23
부모 종료
자식 시작
자식 PID : 23 부모 PID : 22
자식 PID : 23 부모 PID : 22
자식 PID : 23 부모 PID : 22
자식 PID : 23 부모 PID : 1
자식 PID : 23 부모 PID : 1
자식 PID : 23 부모 PID : 1
자식 PID : 23 부모 PID : 1
자식 PID : 23 부모 PID : 1
자식 PID : 23 부모 PID : 1
자식 PID : 23 부모 PID : 1
자식 종료

 

 

고아 프로세스 찾기

 

참고 : https://codetravel.tistory.com/31

 

좀비 프로세스

자식프로세스가 부모 프로세스보다 먼저 종료회는 경우 커널은 최소한의 정보(프로세스ID, 프로세스 종료 상태 등)을 가지고 있게 된다. 부모 프로세스가 좀비 프로세스의 종료상태를 회수하게 되면 좀비 프로세스는 제거된다.

 

좀비 찾기

ps aux | grep 'Z'
ps -ef | grep defunct | grep -v grep

3 좀비 모두 죽이기

ps -ef | grep defunct | awk '{print $3}' | xargs kill -9

좀비 수 확인

top -b -n 1 | grep zombie
ps -ef | grep defunct | grep -v grep | wc -l

 

fork 함수

자식 프로세스를 생성할 때, fork함수를 사용한다. (unistd.h에 존재)

fork 함수에 의해 생성된 자식 프로세스는 부모 프로세스의 메모리르 그대로 복사하여 가지게 된다. fork 함수 호출 이후 코드부터 각자의 메모리를 사용하여 실행한다. fork 함수 실행한 후 부모프로세스와 동일한 주소 공간의 복사본을 가지고 실행된다. 

 

fork 함수가 실행 된 직후에는 자식 프로세스 부모 프로레스와 동일한 주소 공간의 복사본을 가지게 됩니다.

fork 함수 실행 이후 , 부모와 자식 프로세스는 동일한 코드 (x = 1, printf())를 각자 메모리상에서 실행하고 있습니다.

 

fork함수에 대해 알기 위해 일반적으로 아래 코드를 실행해본다. 

 

조건이 pid=0인가로 의문이 들 것이다. 부모 메모리의 경우, fork를 실행하여 pid가 양수이다. 하지만 자식 메모리에서는 fork를 실행하지 않아 pid가 0이다. 

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>


int main() {
     
    pid_t pid =0;
   
    pid = fork();
     
    if(pid > 0) {  // 부모 코드
        printf("부모 PID : %ld,  자식 PID : %d\n", (long)getpid(), pid);
    }
    else if(pid == 0){  // 자식 코드
        printf("자식 PID : %ld",(long)getpid());
    }
    else {  // fork 실패
        printf("fork Fail! \n");
        return -1;
    }
    return 0;
}

결과 : 

자식 PID : 23

부모 PID : 22, 자식 PID : 23

 

참고 : https://codetravel.tistory.com/23

 

Comments