이 글은
오늘까지인 과제 2개, 팀플 회의 1개, 주말까지인 과제 1개, 다음주 월요일 과제 1개가 있는
대학생 카뎃 @jiwahn 이 적습니다.
이번 학기를 어서 exit(); 하고 싶네요 하하하하!!
tl;dr : exit() → atexit() → _exit()
@man 3 exit()
우리의 소중한 exit() 함수.. 모르는 사람 없겠죠..
이 라이브러리 함수의 역할은 프로세스를 종료하고, 자원을 회수해 줍니다.
근데 이거 누가 모릅니까? 우리가 궁금한건 무슨 자원을 어떻게 회수하냐입니다
@man 3 atexit()
얘도 라이브러리 함수입니다.
42에선 atexit(func); 형태로 많이 보셨을거예요.
대충 이름이랑 용법으로 보아선 종료될때 뭘 실행한다는 것처럼 보이죠.
이렇게 함수명이 중요합니다 여러분
@man 2 _exit()
얘는 드디어 시스템콜입니다. exit 라이브러리 내부에서 _exit()을 부르죠.
진짜로 자원을 회수해주는 친구는 얩니다. 그럼 이제 exit()이 무슨 순서로 실행되는지 볼까요?
•
How the exit system call works is in the following:
(a) flush all the streams,
(b) call functions that have been registered with atexit() and on_exit()
(c) perform any other functions associated with exit() for the current system
(d) then, call the system call _exit()
•
_exit(): kernel operation
◦
deallocates all the memory assigned to the finishing process,
◦
closes all files the finishing process had opened, and
◦
frees all the data structures needed by the kernel for other processes.
대략적인 순서는 이렇습니다.
또한 exit()의 인자는 해당 프로세스의 exit status가 되는데 부모 프로세스의 wait() 함수에서 수거할 것입니다.
이 정보는 커널 프로세스 테이블의 status field에 저장되는 것 같습니다(이건 뇌피셜)
자식 프로세스는 종료될 때 이 status field를 set하고 SIGCHILD를 부모 프로세스에 보내죠..
부모가 이 정보를 수거해가지 않으면 종료된 자식 프로세스는 좀비 프로세스가 됩니다.
이 글에 담긴 정보의 출처는 bruce molay - understanding unix/linux programming (2002) 입니다.
다들 메모리 누수 관리 잘 하길 바라며,, 넥슨이 자꾸 서버 점검하는 이유가 뭐겠습니까?,, 암튼 파이팅