본문 바로가기

*집필*/*집필* Network

[Network programming] fork( ) , wait( )

/* 본 정리는 「열혈강의 TCP/IP 소켓 프로그래밍 저.윤성우」를 보고 정리한 정리서 입니다.

/* 본 정리의 기본적인 소스는  www.freelec.co.kr 에서 받을 수 있습니다.


----------------------------

#include <sys/types.h>

#include <unistd.h>

pid_t fork(void)

----------------------------

함수 호출 성공 -> 프로세스 ID 리턴

함수 호출 실패 -> -1 리턴


fork()는 원본 프로세스를 복사하는 함수입니다.

리턴값을 비교하여 부모 프로세스 인지 자식 프로세스인지 확인하여 사용하죠.


fork()를 호출하면서 부터 복사본이 메모리상에 올라옵니다.

원본과 복사본의 차이는 fork()를 호출할때 리턴값으로 pid_t형 변수에 넣게 되는데 그 값을 비교하여

원본인지 복사본인지 확인할 수 있습니다.


원본 프로세스 안의 pid값은 자식프로세스의 ID 값을 가지게 되고 자식프로세스는 pid값 0을 가지게 됩니다.


그림에서 처럼 pid 값을 비교문으로 비교하여 그 값이 0이 아니면 부모 프로세스, 0이면 자식프로세스로 인식하게 됩니다.


좀더 이해를 돕기 위해선 fork()을 이용한 소스를 참조 하세요.



=====================================================================================


프로세스를 복사 하게 되면 좀비 프로세스라 하여 자식 프로세스가 수행을 끝나고 리턴하여 메모리상 사라지지 않는 경우가 생깁니다.


이를 위해 wait() 와 waitpid() 를 사용하게 됩니다.

----------------------------

#include <sys/types.h>

#include <sys/wait.h>

pid_t wait(int * status)

----------------------------

함수 호출 성공 -> 종료된 자식 프로세스 ID 리턴

함수 호출 실패 -> -1 리턴


wait()로 좀비 프로세스의 리턴값을 받아 내고 좀비 프로세스를 종료시킬수 있지만 문제는 좀비 프로세스가 무한 루프 상태가 되었다는 가정에서는 또 다른 문제점이 생깁니다.


자식 프로세스의 리턴값을 받아서 자식프로세스를 종료하는 부모 프로세스는 wait()를 호출하면서 부터 자식프로세스에게서 리턴값을 받기위해 블로킹 상태가 됩니다.


부모 프로세스가 wait()를 호출하기전에 자식프로세스가 리턴을 하게 되면 문제가 없지만 자식프로세스가 무한 루핑을 돌게 되면 부모 프로세스역시 무한 블로킹 상태에 빠지게 되죠.

사용자 삽입 이미지
사용자 삽입 이미지


자식 프로세스가 무한 루핑을 돌게 되면 자식 프로세스 영역에서 풀어주면 되지만 언제 끝날지 모르는 자식프로세스의 리턴을 기다리는 부모 프로세스에서는 문제가 발생한다. 자식 프로세스가 리턴했다고 해서 부모 프로세스가 그걸 알아차리기에는 한계가 있습니다.

sleep(3)으로 3초간 쉬었다가 wait()를 호출하는 방법으로는 컴퓨터 자원으로서는 비효율적이기 때문입니다.


여기서 또다른 방안인 시그널 핸들링으로 해결하는 방법이 있습니다.

시그널핸들링으로 좀비 프로세스 예방법은 다음으로 미루고 여기까지만 쓰고자 합니다.

--------

저는  부산 동명대학교 정보보호학과생인 강동현입니다.

 

가능하면 글의 수정 없이 사용해주셨으면 좋겠습니다.


집필: 강동현