“종료 (-1)”는 어디에서 왔습니까?


22

내가 사용하는 것이 좋습니다 인터넷에서 기존 소프트웨어와 나쁜 튜토리얼을 많이보고 exit(-1), return -1"비정상적인 종료"를 표현하기 위해 또는 이와 유사한. POSIX에서 문제는 적어도 -1지금까지 없었으며 유효한 상태 코드가 아닙니다. man 3 exit그 설명 exit()을 반환에게의 값 status & 0377그 의미, 부모를 -1하게된다 255. POSIX 이외의 시스템에서는 EXIT_FAILURE이식성을 권장합니다. 그러나 "EXIT_FAILURE는 1 이외의 것일 수 있습니다."와 함께 "-1은 비정상 종료를 의미합니다"를 볼 수 없습니다. 이는 POS-1이 아닌 시스템에서도 "-1"이 일반적이라는 것을 분명히 나타냅니다.

다음은 이것을 지속시키는 StackOverflow 질문 의 예입니다 . "unrealircd"소프트웨어도 프로그램 exit(-1)을 종료 하는 데 사용되는 프로그램의 예입니다 . 실제로는와 인터페이스하기가 어렵습니다 systemd.

이 반 패턴은 어디에서 왔습니까? 일부 상황에서 유효합니까?


1
"유닉스 계열 시스템은 종료 상태 0은 성공을 나타내고, 0이 아닌 종료 상태는 실패를 나타냅니다.이 규칙은 Unix 쉘에 거의 연결되어 있습니다 ..."( 0이 아닌 종료 상태 깨끗한 출구를 위해 )
gnat

@gnat libc 매뉴얼 에 따르면 종료 상태는 명시 적으로 0에서 255까지입니다. 어딘가에 음수 값이 유효하다는 답이 있다면 받아 들일 것입니다.
user222973

1
@gnat "255"는에 쉽게 맞습니다 unsigned char.
user222973


1
@gnat "Java"의 바이트는 부호없는 문자가 아니며, char값의 범위가 -128에서 127 사이이기 때문에 a와 동일 합니다. 또한 이미 질문 본문에서 "-1"이 "255"로 변환되었다고 언급했습니다. .
user222973

답변:


20

거의 모든 유닉스 컴퓨터는 정수에 대해 2 보완을 사용하고, 2 보완에서 -1은 단어 크기에 관계없이 항상 "모든 비트 1"입니다. 프로그램의 종료 상태 크기에 관계없이 가능한 가장 큰 종료 코드를 원할 경우 -1을 사용하고 라이브러리를 자르면 편리하게 사용할 수 있습니다.

스크립트 나 프로그램에 가능한 종료 상태가 두 개 이상인 경우 ( grep단순한 예 참조 ) 의미있는 것이 가장 작은 숫자에 할당되므로 가능한 가장 큰 종료 코드를 "알 수없는 오류"또는 "알 수없는" 의미있는 상태 값과 충돌하지 않을 수 있으므로 중단하십시오.


이는 구현, 예를 들어 glibc에 걸릴 exit()으로 status &= 0xff. "단어 크기" -1 & 0xff가 255가 아닌가? 물론 전체적인 목적은 0-255의 범위에 맞추는 것이기 때문입니다. 어쨌든 마지막 문장은 의미가 없습니다. 상태 코드 128-255는 UNIX 시스템에서 특별한 용도로 사용됩니다.
user222973

2
(참조, 0-255있는 프로그램 종료 값 (127, 128+ 특별한 배쉬 값 인이다) 배쉬 종료 값 혼동하지 마십시오 pubs.opengroup.org/onlinepubs/009695399/functions/exit.html을 ). 크기에 관해서는 C 프로그래머는 처음부터 여러 단어 크기 (원래 12, 16 및 32 비트)를 처리 했으므로 단어 크기를 고려할 필요가없는 관용구를 자동으로 시도합니다. 유닉스가 Posix보다 20 년 앞서 왔기 때문에 항상 8 비트 제한이있는 것은 아니기 때문에 문제가되지 않았습니다.
Todd Knarr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.