728x90

좀비 프로세스

- 프로세스는 main 함수가 반환되면 소멸되어야 함

- 그리고 return, exit를 통해 부모 프로세스로 결과 값이 반환이 됨

- 좀비 프로세스는 실행이 완료되었음에도 소멸이 되지 않는 프로세스를 말함

- 그렇기 때문에 프로세스의 리소스가 메모리 공간에 남아있음

- 좀비 프로세스가 생성되는 원인은 종료되면서 반환하는 상태 값이 부모 프로세스에 전달되지 않기 때문

int main(int argc, char *argv[])
{
	pid_t pid=fork();
	
	if(pid==0)     // if Child Process
	{
		puts("Hi I'am a child process");
	}
	else
	{
		printf("Child Process ID: %d \n", pid);
		sleep(30);     // 자식 프로세스의 값을 받지 못하게 sleep
	}

	if(pid==0)
		puts("End child process");
	else
		puts("End parent process");
	return 0;
}

 

좀비 프로세스의 소멸

- wait 함수 : 자식 프로세스가 종료했을 때 OS에 올린 전달 값을 얻는 함수

    -> wait 함수로 int 변수의 주소를 전달하면 반환과 관련된 정보가 저장됨

    -> WIFEXITED : 자식 프로세스가 정상 종료됐는지 확인하는 매크로

    -> WEITSTATE : 자식 프로세스의 전달 값을 반환

    -> 만약 자식 프로세스가 종료되지 않은 상태에서 호출하면 block 상태가 됨

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

int main(int argc, char *argv[])
{
    int status = 0;
    pid_t pid=fork();

    if(pid==0)     // if Child Process
    {
        puts("Hi I'am a child process");
        return 3;
    }
    else
    {
        printf("Child Process ID: %d \n", pid);
        wait(&status);
        if(WIFEXITED(status)) {
            printf("child process's return value = %d\n", WEXITSTATUS(status) );
        }
        sleep(30);     // 자식 프로세스의 값을 받지 못하게 sleep
    }

    if(pid==0)
        puts("End child process");
    else
        puts("End parent process");
    return 0;
}

- waitpid : 특정 자식 프로세스가 종료되었는지 확인하는 방법

    -> 성공 시 종료된 자식 프로세스의 pid 또는 0을 실패 시 -1을 반환

    -> pid : 확인하고자 하는 자식 프로세스의 pid를 전달. -1을 전달하면 임의의 자식 프로세스가 종료되길 대기

    -> options : WNOHANG 상수를 전달하면 종료된 자식 프로세스가 존재하지 않아도 바로 0을 반환하면서 빠져나옴

    -> 그렇기 때문에 wait와는 다르게 block 상태에 가지 않고 바로 확인이 가능

#include <sys/wait.h>

pid_t waitpid(pid_t pid, int* statloc, int options);
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main(int argc, char *argv[])
{
    int status;
    pid_t pid=fork();
    
    if(pid==0)
    {
        sleep(15);
        return 24;   	
    }
    else
    {
        while(!waitpid(-1, &status, WNOHANG))
        {
            sleep(3);
            puts("sleep 3sec.");
        }
        
        if(WIFEXITED(status)) {
            printf("Child send %d \n", WEXITSTATUS(status));
        }
    }
    return 0;
}

728x90

+ Recent posts