2012-01-07 2 views
3

나는 암시 적으로) 종료 (호출하는 경우 :C에서 exit()를 호출 한 후 프로세스에서 어떤 종류의 정리가 발생합니까?

int main(){ 
    return 0; /*exit(0) is being called */ 
} 

으로 또는 명시 적으로 :가 호출되고() 종료 :

int main(){ 
    exit(0); 
    return 0; /* this is never reached */ 
} 

최종 점은 동일합니다. 이제 일부 소스에 따르면 exit()을 사용하면 프로세스를 일부 클린업으로 변경하고 운영 체제로 다시 되돌려 보낼 수 있습니다.

궁극적으로 커널 (OS)이 모든 리소스를 릴리스 할 것이라는 것을 알고 있습니다. 커널을 제어하기 전에 프로세스를 정리하는 것이 특별한 이유는 무엇입니까? 무엇이 excactly이 정리? 왜 그것이 필요한가? 프로세스가 어떻게 알 수 있습니까 정리?

+3

'void main()'이란 무엇입니까? 그건 표준 C가 아니기 때문에 당신의 질문을 대답하기가 어렵게 만듭니다. –

+0

@CodyGray 반환 값을 수정했습니다. – unwind

답변

4

이 질문은 C 사양 (N1256)을 참조하여 해결할 수 있습니다. 함수는 이전에 등록 된 함수 후라는 것을 제외하고 그 등록 역순


3. 먼저 상기 atexit 함수에 의해 등록 된 모든 함수가 호출된다 7.20.4.3는 exit()이 정의를 준다 그것이 등록되었을 때 이미 불려 졌던 것입니다. 이러한 함수에 대한 호출 중에 등록 된 함수에 대한 호출을 종료하는 longjmp 함수 호출이 이루어지면 동작은 정의되지 않습니다.

4. 다음으로, 버퍼링 된 데이터 미기록 모든 오픈 스트림 플러시가 열려 스트림은 폐쇄되고, tmpfile 함수에 의해 생성 된 모든 파일이 삭제된다.

마지막으로 제어가 호스트 환경으로 리턴됩니다. status의 값이 0 또는 EXIT_SUCCESS,이면 구현이 정의한 상태 성공 종료 양식이 리턴됩니다. 상태 값이 EXIT_FAILURE,이면 구현 실패에 대한 구현 정의 형식이 반환됩니다. 그렇지 않은 경우 반환 된 상태는 구현에 따라 정의됩니다.


또는 영어로

:

먼저 호출 등록 된 모든 atexit 기능. 다음으로 버퍼되지 않은 데이터를 모두 플러시합니다. 다음으로 열린 스트림을 닫습니다. 마지막으로 종료 상태와 제어를 OS로 되돌립니다.

+0

나는 영어를 고수 할 것입니다. 감사 :) – Pithikos

0

이것은 OS마다 다르지만 일반적으로 최신 플랫폼에서는 열린 파일이 닫히고 해당 진행중인 (stdio) 버퍼가 플러시됩니다. 다른 정리 작업은 OS 쪽에서 처리됩니다.

+0

커널이 메모리를 해제하지 않습니까? – Pithikos

+2

마지막으로, 커널이 운영 체제의 일부인지 확인했습니다. –

+1

@Pithikos : 당신 말이 맞아요, 아마 프로세스가 메모리 해제와 관련이 없을 것입니다. 열린 파일 닫기에 대한 대답을 제한했습니다. –

4

C 런타임 라이브러리는 프로세스가 종료 될 때 실행중인 사용자 코드를 지원하며 atexit() 기능을 사용하여 설정합니다. 이것은 기본 운영 체제가 알고있는 것이 아니기 때문에 exit()의 코드는이를 구현해야합니다.

+0

그러나 atexit()를 사용하지 않으면 * 정리가 무엇입니까? – Pithikos

+0

@Pithikos : 'exit'문서에 대한 링크를 읽었습니까? 그것은 어떤 일이 일어나는 지 알려줍니다 (POSIX와 C99는이 점에서 같은 것을 지정합니다). – Mat