exit(0)과 return 0에 어떤 차이가 있나요?

someone의 이미지

프로그램을 종료시킬때
별 생각 없이 return 0과 exit(0)을 마구 혼용해서 썼습니다만
하다보니 차이가 있는것 같네요.. -0-;;
(당연히 다른건데 개념없이 마구 사용해왔던 걸까요?? ㅠ_ㅠ)

return 0은 함수에 반환값이 생겨서 종료되는거고
exit(0)은 프로세스를 약간 강제로? 종료시키는 차이인것같은데

구체적으로 동작에 어떤 차이가 있는지요?

hanzo69의 이미지

main()에서 return을 하게 될 경우 main()을 호출한 엔트리포인트코드의 뒷부분이 실행됩니다. 그리고 main()을 실행하던 쓰레드가 종료되면서, 다른 쓰레드가 없다면 프로세스가 종료되겠죠.

exit()를 실행하면 그 내부에서 강제적으로 현재의 프로세스를 파괴합니다.
그러므로 exit() 뒤의 코드는 전혀 실행이 되질 못하죠.

물론 실질적 결과는 main()에서 return하는 것과 같지만, exit()의 호출은 그리 좋은 방법은 아닙니다. 프로그램 흐름상 자원의 해제등과 같은 코드가 실행되지 못하게 만들 가능성이 높으니까요.

가급적이면 main()에서 정상적으로 return할 수 있도록 유도하시는게 어떨까 하네요. 좀 귀찮겠지만요^_^;

님ㅎ 즐~

feelpassion의 이미지

return 을 하게 되면 자동적으로 exit()함수를 호출하게 되어있습니다. exit()함수 안의 인자값이 return 값과 동일한 값이 되는 것으로 알고있습니다.

남으로 창을 내겠소.
밭이 한참갈이 괭이로 파고 호미론 김을 메지요.
구름이 꼬인다 갈리있소. 새들의 노래는 공으로 들으랴오.
강냉이가 익거든 와자셔도 좋소.
왜 사냐건 웃지요.

운형의 이미지

hanzo69 wrote:
물론 실질적 결과는 main()에서 return하는 것과 같지만, exit()의 호출은 그리 좋은 방법은 아닙니다. 프로그램 흐름상 자원의 해제등과 같은 코드가 실행되지 못하게 만들 가능성이 높으니까요.

그런가요..???
unix like 플렛폼에서 제공하는 exit는 사용자 라이브러리로 분류가 되있는 걸로 알고 있습니다. 이건 시스템 콜을 래핑한 거라는 의미구요. 이 래핑에는 분영 자원해제가 들어 갑니다. 내부적으로 호출하는 시스템 콜을 _exit입니다.
윈도우 쪽에서 구현된 것은 어떨지 모르겠군요.

Do you think that's the air you are breathing now?

운형의 이미지

hanzo69 wrote:
물론 실질적 결과는 main()에서 return하는 것과 같지만, exit()의 호출은 그리 좋은 방법은 아닙니다. 프로그램 흐름상 자원의 해제등과 같은 코드가 실행되지 못하게 만들 가능성이 높으니까요.

그런가요..???
unix like 플렛폼에서 제공하는 exit는 사용자 라이브러리로 분류가 되있는 걸로 알고 있습니다. 이건 시스템 콜을 래핑한 거라는 의미구요. 이 래핑에는 분영 자원해제, 시그널링 등이 들어 갑니다. 내부적으로 호출하는 시스템 콜을 _exit입니다.
윈도우 쪽에서 구현된 것은 어떨지 모르겠군요.

Do you think that's the air you are breathing now?

서지훈의 이미지

여기에 관한 좀 더 상세한 내용은 APUE(Ch 7.3) 부분을 참고 하시면은 좋은 해답을 얻으실 것 같네요.

<어떠한 역경애도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

cinsk의 이미지

C 표준에 따르면,

Quote:
(재귀적으로 불리지 않은) 처음 시작한 main()이 "return X"를 실행하는 것은,
exit(X)를 부르는 것과 완전히 같습니다.

(재귀적으로 불리지 않은) 처음 시작한 main()이 블럭의 끝을 알리는 "}"에 다다르면 "return 0" 즉 exit(0)을 부른 것과 완전히 같습니다.

따라서 main()에서 return을 하는 것이나 exit()를 부르는 것이나 거의 같다고 보시면 됩니다.

한 가지 예외는 main()에서 만든 local variable이 파괴되는 시점입니다. exit()를 부르면, exit()가 atexit()로 등록한 함수들을 실행할 때까지 local variable은 남아 있지만, return으로 끝냈을 경우, local variable이 다 파괴된 다음에 exit()가 호출됩니다. atexit()로 등록한 함수가 없다면, "return"이나 exit()를 부르는 것이나 같다고 보면 되겠습니다.

hanzo69의 이미지

main의 지역변수에 소멸자가 있는 객체가 선언된 상황을 생각해보시면 간단해집니다.
중간에 exit()를 호출하면 그 소멸자는 실행이 되지 못할테니까요.
그건 전역변수로 선언된 객체의 소멸자 또한 마찬가지입니다.

내가 소멸자를 쓰지 않는다 하더라도, 내가 사용하게 될 모듈의 작성자나, 같이 일하는 사람이 소멸자를 만들지 말라는 법은 없으니까요.

님ㅎ 즐~

singlet의 이미지

hanzo69 wrote:
main의 지역변수에 소멸자가 있는 객체가 선언된 상황을 생각해보시면 간단해집니다.
중간에 exit()를 호출하면 그 소멸자는 실행이 되지 못할테니까요.
그건 전역변수로 선언된 객체의 소멸자 또한 마찬가지입니다.

지역변수로 선언된 객체에 대해서는 hanzo69 님의 지적이 맞습니다.

하지만 main 함수에서 return 하는 경우는 물론 exit 함수가 호출되는 경우에도 전역변수로 선언된 객체의 소멸자는 반드시 실행됩니다. 마찬가지로, 정적변수로 선언된 객체의 소멸자도 실행됩니다.

pinetr2e의 이미지

앞서 글쓰신 분의 내용 관련한
C++98 규격의 내용입니다.

3.6.1. Termination

...
4.
Calling the function void exit(int);
declared in <cstdlib> (18.3) terminates the program without leaving the current block and hence without
destroying any objects with automatic storage duration (12.4). If exit is called to end a program during
the destruction of an object with static storage duration, the program has undefined behavior.

5. A return statement in main has the effect of leaving the main function (destroying any objects with automatic
storage duration) and calling exit with the return value as the argument. If control reaches the end
of main without encountering a return statement, the effect is that of executing
return 0;

...

park712의 이미지

리플 안 남기려고 했는데요.
그 차이는 글로 표현하면 너무 길어서
그냥 컴파일이나 C언어 설계에 관한 책을 보셔야겠습니다.
일반적으로 코딩할때는 윗답변도 틀린것은 아니지만
자세히 알려면 컴파일쪽을 알아야 합니다.

후회없이 살자

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.