물론 실질적 결과는 main()에서 return하는 것과 같지만, exit()의 호출은 그리 좋은 방법은 아닙니다. 프로그램 흐름상 자원의 해제등과 같은 코드가 실행되지 못하게 만들 가능성이 높으니까요.
그런가요..???
unix like 플렛폼에서 제공하는 exit는 사용자 라이브러리로 분류가 되있는 걸로 알고 있습니다. 이건 시스템 콜을 래핑한 거라는 의미구요. 이 래핑에는 분영 자원해제가 들어 갑니다. 내부적으로 호출하는 시스템 콜을 _exit입니다.
윈도우 쪽에서 구현된 것은 어떨지 모르겠군요.
Do you think that's the air you are breathing now?
물론 실질적 결과는 main()에서 return하는 것과 같지만, exit()의 호출은 그리 좋은 방법은 아닙니다. 프로그램 흐름상 자원의 해제등과 같은 코드가 실행되지 못하게 만들 가능성이 높으니까요.
그런가요..???
unix like 플렛폼에서 제공하는 exit는 사용자 라이브러리로 분류가 되있는 걸로 알고 있습니다. 이건 시스템 콜을 래핑한 거라는 의미구요. 이 래핑에는 분영 자원해제, 시그널링 등이 들어 갑니다. 내부적으로 호출하는 시스템 콜을 _exit입니다.
윈도우 쪽에서 구현된 것은 어떨지 모르겠군요.
Do you think that's the air you are breathing now?
(재귀적으로 불리지 않은) 처음 시작한 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()를 부르는 것이나 같다고 보면 되겠습니다.
...
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;
main()에서 return 하는 것 같네요.
main()에서 return을 하게 될 경우 main()을 호출한 엔트리포인트코드의 뒷부분이 실행됩니다. 그리고 main()을 실행하던 쓰레드가 종료되면서, 다른 쓰레드가 없다면 프로세스가 종료되겠죠.
exit()를 실행하면 그 내부에서 강제적으로 현재의 프로세스를 파괴합니다.
그러므로 exit() 뒤의 코드는 전혀 실행이 되질 못하죠.
물론 실질적 결과는 main()에서 return하는 것과 같지만, exit()의 호출은 그리 좋은 방법은 아닙니다. 프로그램 흐름상 자원의 해제등과 같은 코드가 실행되지 못하게 만들 가능성이 높으니까요.
가급적이면 main()에서 정상적으로 return할 수 있도록 유도하시는게 어떨까 하네요. 좀 귀찮겠지만요^_^;
님ㅎ 즐~
return 을 하게 되면 자동적으로 exit()함수를 호출하게 되어있습
return 을 하게 되면 자동적으로 exit()함수를 호출하게 되어있습니다. exit()함수 안의 인자값이 return 값과 동일한 값이 되는 것으로 알고있습니다.
남으로 창을 내겠소.
밭이 한참갈이 괭이로 파고 호미론 김을 메지요.
구름이 꼬인다 갈리있소. 새들의 노래는 공으로 들으랴오.
강냉이가 익거든 와자셔도 좋소.
왜 사냐건 웃지요.
Re: main()에서 return 하는 것 같네요.
그런가요..???
unix like 플렛폼에서 제공하는 exit는 사용자 라이브러리로 분류가 되있는 걸로 알고 있습니다. 이건 시스템 콜을 래핑한 거라는 의미구요. 이 래핑에는 분영 자원해제가 들어 갑니다. 내부적으로 호출하는 시스템 콜을 _exit입니다.
윈도우 쪽에서 구현된 것은 어떨지 모르겠군요.
Do you think that's the air you are breathing now?
Re: main()에서 return 하는 것 같네요.
그런가요..???
unix like 플렛폼에서 제공하는 exit는 사용자 라이브러리로 분류가 되있는 걸로 알고 있습니다. 이건 시스템 콜을 래핑한 거라는 의미구요. 이 래핑에는 분영 자원해제, 시그널링 등이 들어 갑니다. 내부적으로 호출하는 시스템 콜을 _exit입니다.
윈도우 쪽에서 구현된 것은 어떨지 모르겠군요.
Do you think that's the air you are breathing now?
여기에 관한 좀 더 상세한 내용은 APUE(Ch 7.3) 부분을 참고
여기에 관한 좀 더 상세한 내용은 APUE(Ch 7.3) 부분을 참고 하시면은 좋은 해답을 얻으실 것 같네요.
<어떠한 역경애도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
C 표준에 따르면,[quote](재귀적으로 불리지 않은) 처음 시
C 표준에 따르면,
따라서 main()에서 return을 하는 것이나 exit()를 부르는 것이나 거의 같다고 보시면 됩니다.
한 가지 예외는 main()에서 만든 local variable이 파괴되는 시점입니다. exit()를 부르면, exit()가 atexit()로 등록한 함수들을 실행할 때까지 local variable은 남아 있지만, return으로 끝냈을 경우, local variable이 다 파괴된 다음에 exit()가 호출됩니다. atexit()로 등록한 함수가 없다면, "return"이나 exit()를 부르는 것이나 같다고 보면 되겠습니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
단순히 main()에서 printf()몇개 호출하고 끝난다면 모르지만...
main의 지역변수에 소멸자가 있는 객체가 선언된 상황을 생각해보시면 간단해집니다.
중간에 exit()를 호출하면 그 소멸자는 실행이 되지 못할테니까요.
그건 전역변수로 선언된 객체의 소멸자 또한 마찬가지입니다.
내가 소멸자를 쓰지 않는다 하더라도, 내가 사용하게 될 모듈의 작성자나, 같이 일하는 사람이 소멸자를 만들지 말라는 법은 없으니까요.
님ㅎ 즐~
Re: 단순히 main()에서 printf()몇개 호출하고 끝난다면 모르지
지역변수로 선언된 객체에 대해서는 hanzo69 님의 지적이 맞습니다.
하지만 main 함수에서 return 하는 경우는 물론 exit 함수가 호출되는 경우에도 전역변수로 선언된 객체의 소멸자는 반드시 실행됩니다. 마찬가지로, 정적변수로 선언된 객체의 소멸자도 실행됩니다.
앞서 글쓰신 분의 내용 관련한C++98 규격의 내용입니다.
앞서 글쓰신 분의 내용 관련한
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;
...
리플 안 남기려고 했는데요.그 차이는 글로 표현하면 너무 길어서그
리플 안 남기려고 했는데요.
그 차이는 글로 표현하면 너무 길어서
그냥 컴파일이나 C언어 설계에 관한 책을 보셔야겠습니다.
일반적으로 코딩할때는 윗답변도 틀린것은 아니지만
자세히 알려면 컴파일쪽을 알아야 합니다.
후회없이 살자
댓글 달기