저는 C++ 프로그래밍을 처음 접했고 매우 기본적인 질문이 있습니다. -1
C++ 프로그램 으로 돌아가서 종료 상태를 확인하면 255
왜 이런 현상이 발생합니까?
코드는 기본입니다.
int main()
{
return -1;
}
그런 다음 컴파일된 코드를 실행합니다.
echo $?
255
답변1
UNIX/POSIX에서는 프로그램의 종료 코드가 부호 없는 8비트 값으로 정의되기 때문입니다. -1을 부호 없는 8비트로 변환하면 255가 됩니다.
다음을 추가하도록 편집되었습니다.
자세한 내용을 제공하려면 UNIX의 wait*() 시스템 호출 계열은 프로세스 결과를 단일 32비트 정수로 인코딩합니다. 이 결과의 32비트는 프로세스가 코어를 덤프하고 신호(및 어떤 신호)와 함께 종료되었는지 여부와 같은 정보를 제공하기 위해 더 세분화됩니다. 이 32비트 중 8비트만이 프로세스의 종료 코드용으로 예약되어 있으며 이는 부호 없는 값으로 해석됩니다.
UNIX/POSIX의 fork/exec/wait 모델은 가장 오래되고 심오한 기능 중 하나입니다. 오늘날 새로운 운영 체제를 설계한다면 아마도 다른 작업을 수행할 것입니다(적어도 64비트를 사용:-)).
반면에 >255 종료 코드가 정말 유용할까요? 나는 그것을 의심한다. 정말로 더 많은 기능을 원한다면 더 넓은 범위의 숫자 종료 코드 대신 "종료 문자열"로 전환하는 것이 좋습니다.
답변2
매뉴얼 bash
페이지 인용종료 상태
실행된 명령의 종료 상태는 waitpid 시스템 호출 또는 동등한 함수에 의해 반환된 값입니다. 종료 상태의 범위는 0부터 255까지인데, 쉘에서는 아래 설명처럼 구체적으로 125보다 높은 값을 사용할 수도 있습니다. 쉘 내장 및 복합 명령의 종료 상태도 이 범위로 제한됩니다. 어떤 경우에는 쉘이 특정 오류 모드를 나타 내기 위해 특수 값을 사용합니다.
그래서 그것은 그것에 국한되어 있습니다. 사실 저도 당신만큼 놀랐습니다.
waitpid (2)
매뉴얼 페이지 에서 :
WEXITSTATUS(status)
자식 프로세스의 종료 상태를 반환합니다. 이는 exit(3) 또는 _exit(2)를 호출할 때 하위 프로세스에 의해 지정되거나 main()의 return 문에 대한 인수로 지정되는 상태 매개변수의 최하위 8비트로 구성됩니다. 이 매크로는 WIFEXITED가 true를 반환하는 경우에만 사용해야 합니다.