맨위로가기

종료 상태

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

종료 상태는 부모 프로세스와 자식 프로세스 간의 약속된 의미를 가지는 코드로, 일반적으로 0은 성공, 0이 아닌 값은 실패를 나타낸다. 셸, C, Java, POSIX 등 다양한 운영체제와 프로그래밍 언어에서 종료 상태를 다루는 방식이 다르며, 각 시스템은 고유한 종료 코드 체계를 가질 수 있다. POSIX 시스템에서는 0을 성공, 0이 아닌 값을 오류로 간주하며, 윈도우는 32비트 정수를 사용한다. 종료 상태는 프로그램의 실행 결과를 나타내며, 오류 발생 시 문제의 원인을 파악하는 데 중요한 역할을 한다.

더 읽어볼만한 페이지

  • 프로세스 - 문맥 교환
    문맥 교환은 운영 체제에서 CPU가 여러 프로세스나 스레드를 번갈아 실행하기 위해 현재 작업 상태를 저장하고 다른 작업 상태를 복원하는 과정으로, 멀티태스킹 환경에서 필수적인 기술이며 프로세스 제어 블록을 통해 관리된다.
  • 프로세스 - 데몬 (컴퓨팅)
    데몬은 운영 체제에서 사용자와 상호 작용 없이 백그라운드에서 실행되며 시스템의 다양한 작업을 처리하는 프로세스이다.
종료 상태
일반 정보
유형종료 상태
설명프로세스 종료 시 부모 프로세스에 제공되는 정수 값
목적
사용 목적프로세스의 성공 또는 실패 여부 및 실패 원인에 대한 정보를 전달
값의 범위
범위0부터 255까지의 정수 (일반적으로)
0 값 의미성공적인 종료
비 0 값 의미오류 발생 또는 비정상적인 종료
활용
사용스크립트, 프로그램 또는 운영 체제에서 사용
반환 방법exit() 시스템 호출 또는 return 문 사용
확인 방법wait() 시스템 호출
$? 변수 (셸 스크립트)
추가 정보
기타종료 상태는 디버깅, 오류 처리 및 프로세스 제어에 유용
일부 운영 체제는 더 넓은 범위의 값을 허용할 수 있음
관련 용어
관련 용어exit
wait
반환 코드
결과 코드

2. 시맨틱

종료 코드는 부모 프로세스와 자식 프로세스 간에 약속된 의미를 가진다. 일반적으로 0은 성공, 0이 아닌 값은 실패를 나타낸다. 구체적인 값은 프로그램에 따라 다르며, 실패 원인을 나타내기도 한다. 일부 시스템에서는 종료 코드의 각 비트가 특정 조건을 나타내기도 한다. 예를 들어, fsck는 각 비트별로 의미를 부여하고, 이들의 논리합으로 종료 상태를 결정한다.[2]

프로세스가 정상적으로 종료되었는지, 신호에 의해 종료되었는지 등의 정보는 부모 프로세스에서 확인할 수 있다. 경우에 따라, 종료 상태를 잘 설계하면 호출한 프로그램에서 조건 분기 인덱스로 직접 사용할 수 있다.

셸 스크립트에서는 일반적으로 명령 실행 후 종료 상태를 캡처한다. 셸에서 종료 상태 0은 명령어의 성공을, 0이 아닌 값은 실패를 의미한다.

C 프로그래밍 언어는 `main` 함수에서 정수를 반환하거나, `EXIT_SUCCESS` 및 `EXIT_FAILURE` 매크로를 반환하여 성공 또는 실패를 알릴 수 있다. 유닉스 계열 시스템에서는 각각 0과 1에 해당한다.

자바에서는 `System.exit(int status)`를 호출하여 자바 가상 머신을 종료할 수 있으며, 0이 아닌 상태 코드는 비정상 종료를 나타낸다.

OpenVMS에서는 성공은 홀수 값, 실패는 짝수 값으로 표시한다. 유닉스POSIX 호환 시스템에서는 `wait()` 계열의 시스템 호출을 사용하여 하위 프로세스의 종료 상태를 검색할 수 있다.

2. 1. 셸 및 스크립트

셸 스크립트에서 종료 상태 0은 명령어의 성공을, 0이 아닌 값은 실패를 의미한다. 명령어가 특정 신호에 의해 종료된 경우, 셸은 128 + 신호 번호 (N) 값을 종료 코드로 설정한다. (ksh93은 256+N) 명령어를 찾을 수 없으면 127, 실행할 수 없으면 126을 반환한다.

bash에서 종료 상태는 0-255 범위이며, 범위를 벗어난 정수는 256으로 나눈 나머지가 된다. 바로 직전 명령어의 종료 상태는 `$?`로 참조할 수 있으며, `if`, `&&`, `||` 등의 제어 연산자에서 이용할 수 있다.

2. 1. 1. 예약된 종료 상태 (bash)

셸 스크립트에서 `if`, `&&`, `||` 등의 제어 연산자에서 활용되는 예약된 종료 상태는 다음과 같다.[3]

종료 상태의미
1일반적인 오류
2빌트인 명령의 오용
126명령을 실행할 수 없었음 (실행 권한이 없었음)
127명령을 찾을 수 없었음
128`exit`에 부정한 값을 전달했음 (예: 부동 소수점 수)
128+n시그널 n으로 종료
255범위 밖의 종료 상태


2. 2. C 언어

C 언어에서는 프로그램이 main 함수에서 반환되거나 종료될 때 정수를 반환하거나, 매크로 `EXIT_SUCCESS`와 `EXIT_FAILURE`를 사용하여 성공 또는 실패를 알릴 수 있다. 유닉스 계열 시스템에서 `EXIT_SUCCESS`는 0, `EXIT_FAILURE`는 1을 의미한다.[15] C 프로그램은 `exit()` 함수의 첫 번째 인자로 정수 상태나 종료 매크로를 지정하여 종료할 수도 있다.

main 함수에서 반환된 값은 `exit` 함수에 전달되며, 0, `EXIT_SUCCESS`, `EXIT_FAILURE`의 경우 "성공적인 종료" 또는 "실패한 종료"로 변환된다.

C 표준은 0, `EXIT_SUCCESS`, `EXIT_FAILURE` 외에는 반환 코드의 의미를 정의하지 않으므로, 반환 코드 사용 규칙은 플랫폼에 따라 다를 수 있다.

2. 3. Java

자바에서는 보안 관리자가 허용하는 한, 어떤 메서드라도 `System.exit(int status)`를 호출하여 현재 실행 중인 자바 가상 머신을 종료할 수 있다. 이때 0이 아닌 상태 코드는 비정상 종료를 의미한다.[16]

2. 4. POSIX

POSIX 호환 시스템에서 상위 프로세스는 `wait()` 계열의 시스템 호출을 사용하여 하위 프로세스의 종료 상태를 검색할 수 있으며, 이는 wait.h에 정의되어 있다.[17] 이 중 `waitid()` 호출은 전체 종료 상태를 검색하지만, 이전 `wait()` 및 `waitpid()` 호출은 종료 상태의 하위 8비트만 검색한다.

`wait()` 및 `waitpid()` 인터페이스는 여러 유형의 자식 종료 정보를 포함하는 비트 필드로 묶인 `int` 유형의 ''status'' 값을 설정한다. 자식이 종료함으로써 종료된 경우 ( `WIFEXITED()` 매크로에 의해 결정됨; 일반적인 대안은 잡히지 않은 신호로 인해 죽은 경우), SUS는 `WEXITSTATUS()` 매크로를 사용하여 종료 상태의 하위 8비트를 상태 값에서 검색할 수 있다고 명시한다.

`waitid()` 시스템 호출 (SUSv1과 함께 추가됨)에서 자식 종료 상태 및 기타 정보는 더 이상 비트 필드가 아닌 `siginfo_t` 유형의 구조체에 있다.

POSIX 호환 시스템은 일반적으로 성공의 경우 0, 오류의 경우 0이 아닌 값을 사용하는 규칙을 사용한다. 일부 규칙은 다양한 오류 코드의 상대적 의미에 따라 개발되었다. 예를 들어 GNU는 상위 비트가 설정된 코드를 심각한 오류에 예약할 것을 권장한다.

BSD 파생 OS는 광범위한 선호되는 해석 세트를 정의했다. 64에서 78까지의 15개 상태 코드의 의미는 sysexits.h에 정의되어 있다. 이것들은 역사적으로 sendmail 및 기타 메시지 전송 에이전트에서 파생되었지만, 이후 많은 다른 프로그램에서 사용되었다.

Advanced Bash-Scripting Guide와 /usr/include/sysexits.h에는 0이 아닌 종료 상태 코드의 의미에 대한 정보가 있다.

유닉스 계열에서는, `wait` 시스템 콜이 설정하는 상태는 자식 프로세스의 종료 시 각종 정보를 정리한 비트 필드로 구성되어 있다. 자식 프로세스가 정상 종료한 경우(WIFEXITED 매크로로 판정한다. 그 외에는 시그널 수신으로 종료되는 경우가 있다), SUS에서는 상태의 하위 8비트가 자식 프로세스가 설정한 종료 상태를 나타내도록 되어 있다. 그 값은 `wait.h`에 정의된 매크로 WEXITSTATUS로 얻을 수 있다. 이 때문에, 유닉스 계열의 종료 상태 값은 0부터 255까지(8비트 부호 없는 정수)로 제한되어 있다(그 이상의 값을 지정해도 부모 프로세스 측에서 하위 8비트밖에 받지 못한다).

관습적으로 정상 종료 시에는 0, 비정상 종료 시에는 0 이외의 값을 반환하는 것이 일반적이다. 각종 에러 코드의 의미에 대한 규약을 정하려 했던 예도 있다. 예를 들어 GNU는 상위 비트를 심각한 에러를 나타내기 위해 예약할 것을 권장하고 있다. BSD에서는 더욱 상세하게 권장되는 해석을 문서화하고 있다[8][9].

3. 운영체제별 상세

도스에서 '''errorlevel'''은 실행 프로그램이나 함수가 반환하는 정수 형태의 종료 코드를 의미하며, 보통 0부터 255까지의 범위를 가진다. 종료 상태는 배치 파일에서 `IF ERRORLEVEL` 명령어로 확인할 수 있으며, 이 명령어는 지정한 값 이상인지 판단한다.

DR-DOS, Multiuser DOS, 4DOS 등은 확장된 종료 코드 기능을 제공하며, DR-DOS 6.0 이상에서는 CONFIG.SYS에서 16비트 오류 코드를 지원한다.

오픈VMS에서 성공은 홀수 값으로, 실패는 짝수 값으로 표시된다. 이 값은 제어 비트, 팩토리 번호, 메시지 번호 및 심각도로 구성된 32비트 정수이며, 심각도 값은 성공(성공, 정보)과 실패(경고, 오류, 치명적)로 나뉜다.

윈도우는 32비트 부호 있는 정수를 종료 코드로 사용한다.[12] 프로세스 초기화에 실패하면 윈도우 시스템 오류 코드가 반환된다.[13][14] cmd.exe의 `errorlevel`은 COMMAND.COM의 것을 그대로 계승하며, .NET Framework 프로세스와 윈도우 파워셸은 종료 상태를 `Process` 객체의 `ExitCode` 속성으로 참조한다.

Plan 9의 C에서 종료 상태는 `exits` 함수에 전달되는 문자열로 표시되며, main 함수는 void 타입이다.

3. 1. 아미가OS

아미가OS, MorphOS, AROS에서는 다음과 같은 네 가지 수준의 종료 코드가 정의된다.

  • OK: 0
  • WARN: 5
  • ERROR: 10
  • FAILURE: 20

3. 2. 도스

도스에서 '''errorlevel'''은 실행 프로그램이나 함수가 반환하는 정수 형태의 종료 코드를 의미한다. errorlevel의 범위는 보통 0부터 255까지이다.

종료 상태는 배치 파일에서 `IF ERRORLEVEL` 명령어로 확인할 수 있다. 이 명령어는 지정한 값 이상인지 판단한다.

DR-DOS, Multiuser DOS, 4DOS 등은 확장된 종료 코드 기능을 제공한다. DR-DOS 6.0 이상에서는 CONFIG.SYS에서 16비트 오류 코드를 지원한다.

3. 3. 오픈VMS

오픈VMS에서 성공은 홀수 값으로, 실패는 짝수 값으로 표시된다. 이 값은 제어 비트, 팩토리 번호, 메시지 번호 및 심각도로 구성된 32비트 정수이다. 심각도 값은 성공(성공, 정보)과 실패(경고, 오류, 치명적)로 나뉜다.

3. 4. 윈도우

윈도우는 32비트 부호 있는 정수를 종료 코드로 사용한다.[12] 프로세스 초기화에 실패하면 윈도우 시스템 오류 코드가 반환된다.[13][14]

cmd.exe의 `errorlevel`은 COMMAND.COM의 것을 그대로 계승한다. .NET Framework 프로세스와 윈도우 파워셸은 종료 상태를 `Process` 객체의 `ExitCode` 속성으로 참조한다.

3. 5. Plan 9

Plan 9의 C에서 종료 상태는 `exits` 함수에 전달되는 문자열로 표시되며, main 함수는 void 타입이다.

참조

[1] 서적 プロフェッショナルUNIX 株式会社アスキー 1986-01-15
[2] 웹사이트 Errorlevels http://www.robvander[...] Rob van der Woude's Scripting Pages 2007-08-26
[3] 웹사이트 Exit Codes With Special Meanings http://tldp.org/LDP/[...] 2018-06-21
[4] 웹사이트 The GNU C Library Reference Manual 25.6.2: Exit Status http://www.gnu.org/s[...] GNUプロジェクト 2012-07-09
[5] 웹사이트 Java 1.6.0 API http://java.sun.com/[...] Sun 2008-05-06
[6] 문서 wait
[7] 웹사이트 Chapter 6. Exit and Exit Status http://www.faqs.org/[...] Faqs.org 2012-07-09
[8] 문서 sysexits FreeBSD
[9] 뉴스 sysexits(3)]: preferable exit codes for programs – NetBSD Manual Pages http://netbsd.gw.com[...]
[10] 문서 sysexits OpenBSD
[11] 웹사이트 OpenVMS Format of Return Status Values http://h71000.www7.h[...] H71000.www7.hp.com 2012-07-09
[12] 웹사이트 ExitCodes bigger than 255, possible? http://stackoverflow[...] 2009-09-28
[13] 웹사이트 Windows System Error Codes (exit codes) http://www.hiteksoft[...] 2009-09-28
[14] 웹사이트 MSDN article System Error Codes http://msdn.microsof[...] Microsoft 2012-07-30
[15] 웹인용 The GNU C Library Reference Manual 25.6.2: Exit Status https://www.gnu.org/[...] Gnu.org 2012-07-09
[16] 웹인용 Java 1.6.0 API http://java.sun.com/[...] Sun 2008-05-06
[17] 웹인용 Chapter 6. Exit and Exit Status http://www.faqs.org/[...] Faqs.org 2012-07-09
[18] 웹인용 ExitCodes bigger than 255, possible? http://stackoverflow[...] 2009-09-28
[19] 웹인용 Windows System Error Codes (exit codes) http://www.hiteksoft[...] 2009-09-28
[20] 웹인용 MSDN article System Error Codes http://msdn.microsof[...] Microsoft



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com