void main()의 exit code에 대해 질문 드릴것이 있습니다.

ktojong의 이미지

csh에서

void main()
{
printf("Hello World\n");
}

실행 이후
$? , $status를 이용하면
13이라는 코드가 뜹니다.

그런데

void main(int argc, char **argv)
{
printf("Hello World\n");
printf("%d\n",argc);
}

이후
$? , $status를 이용하면
2이라는 코드가 뜹니다.

왜 소스코드에 따라 종료코드가 다른지 이유가 궁금합니다.
감사합니다^^

jick의 이미지

원래 main은 int 형으로 선언하고 리턴값을 반환해야 하는 것이 표준입니다.

void로 선언해도 거의 모든 경우 돌아가기는 합니다만 shell에 돌려줘야 할 리턴값을 정의하지 않았으므로 쓰레기값이 들어갑니다. x86기준으로 리턴값은 eax 레지스터에 들어가는데 그 레지스터에 특별히 값을 지정하지 않았으므로 main 함수가 종료되는 순간 eax에 들어있던 값이 리턴값으로 간주될 것입니다.

한마디로 그냥 우연입니다.

pynoos의 이미지

표준은 정의되어 있지 않은 값일테고, 테스트하신 구현은 마지막 실행문인 printf 의 return 값이 전달되어서 나온 것 같군요. printf 는 출력된 문자의 갯수니까요.

jick의 이미지

(그런 훌륭한 설명이!)

...혹시라도 나중에 이 글을 읽을 분들을 위해 노파심에 부연하자면, 이건 물론 컴파일러가 어쩌다 보니 운이 좋아(?) 일어난 일일 뿐이고, "아 그러면 main에서 마지막으로 부른 함수의 리턴값이 프로세스의 종료 코드가 되겠군!" 같은 건 물론 당연히 절대 보장이 되지 않습니다. :)

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.