Search
Duplicate

exit() atexit() _exit() 뭐가 다른지 설명할 수 있어?

간단소개
exit() 조금 더 알아보기
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
system programming
42seoul
Scrap
태그
Operating System
9 more properties
이 글은
오늘까지인 과제 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) 입니다.
다들 메모리 누수 관리 잘 하길 바라며,, 넥슨이 자꾸 서버 점검하는 이유가 뭐겠습니까?,, 암튼 파이팅