EASY7
자식 프로세스와 fork 함수 본문
고아 프로세스
부모 프로세스가 자식 프로세스보다 먼저 종료되면 고아 프로세스가 된다.
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
'보안 공부 > 다양한 지식' 카테고리의 다른 글
[NSIS] nsis 이용하여 파일 배포하기 (0) | 2023.05.18 |
---|---|
2022년 1회 정보보안기사 필기 오답정리 (2) | 2022.03.13 |
SHA1 Collision Test Site (0) | 2021.05.13 |
[포렌식] 하드디스크 포렌식 (0) | 2021.05.11 |
[포렌식] 포렌식 개론 (0) | 2021.05.11 |