본문 바로가기

Linux

왜 자식프로세스에서 exit대신에 _exit를 일반적으로 더 사용 하는가?

왜 자식프로세스에서 exit대신에 _exit를 일반적으로 더 사용 하는가?
-------------------------------------------------------------------

exit()와 _exit()는 약간의 차이가 있다. 이것은 특히 fork()를 사용하느냐,
vfork()를 사용하느냐에 따라 중요성이 더해진다.

exit()와 _exit()의 기본적인 차이는 전자는 사용자모드의의 clean-up 을 수행하며
사용자에게 지원되는 함수형태이다. 반면에 후자는 커널 모드에서 동작한다.

fork()의 자식 프로세스에서 exit()를 사용하는건 일반적으로 틀리다. 왜냐하면
이것을 사용하면 stdio 버퍼가 두번 플러시(flush)되도록 하고 임시 파일들이
예기치 못하게 삭제 된다. C++코드에서 이러한 상황은 최악으로 발전되게 되는데
그 이유는 static 오브젝트에 대한 destructor가 실행이 잘못될 수 있기 때문이다
(일반적인 경우는 아니지만, 데몬프로그램의 경우에 자식 프로세스에서 보다는
부모 프로세스에서 _exit()가 사용되어야 한다. 기본 룰은 exit()는 main함수
내에서 한번만 수행 되어야 한다는 것이다.)

vfork()에 의한 자식 프로세스에서 exit()의 사용은 아주 위험하다. 왜냐!?
부모 프로세스의 상태를 변경 시킬 수 있기 때문이다.