exit () 상태에서 256에 의해 Cover Division에서 WexitStatus 매크로를 사용하는 데 어떤 이점이 있습니까?

StackOverflow https://stackoverflow.com/questions/808541

  •  03-07-2019
  •  | 
  •  

문제

나는 출구로 가치를 반환해야했던 대학에서 운동을하고 있었는데, 그 가치는 실제로 무언가의 수였습니다. 이것은 255 (exit ()가 처리 할 수없는) 이상일 수 있지만 교사는 카운트가 해당 값을 초과 할 수없는 테스트 데이터를 사용하도록 제안했습니다.

이 결국, 나는이 카운트 값, 종료 상태를 처리해야했고, waitpid ()를 사용하여 기본 프로세스 에서이 값을 얻었습니다. 놀랍게도, 아동 프로세스가 1을 반환한다면, 주요 과정의 "실제"값은 256, 2는 512 등이었습니다 ...

이 값을 인쇄해야했기 때문에 단순히 256으로 나누었고 완료되었습니다. 그러나 wexitstatus () 매크로를 사용하면 원하는 방식 으로이 가치를 얻을 것입니다 ...

나는 C 소스 코드를 보았고 이것이 내가 알게 된 것입니다.

#define __WEXITSTATUS(status) (((status) & 0xff00) >> 8)

예를 들어, 바이너리의 512는 10 0000 0000이며, 오른쪽은 00 0000 0010을 제공하며, 이는 소수점에서 2입니다. 내가이 매크로에서 이해하지 못하는 것은 그 & 운영자와 0xff00이 임의의 숫자로 보인다는 사실입니다 (아마도 어디에서 왔습니까?). 이것이 정확히 무엇을합니까, 왜 매크로에 "& 0xff00"이 있습니까? 그것으로 작동하지 않습니까?

그리고이 주제의 실제 질문은 내 코드 에서이 매크로를 256으로 나누는 것으로 부르는 것과 동일합니까?

도움이 되었습니까?

해결책

그리고이 주제의 실제 질문은 내 코드 에서이 매크로를 256으로 나누는 것으로 부르는 것과 동일합니까?

아마도 아동 프로세스가 정상적으로 종료되는 경우 (즉, 세분화 결함, 어설 션 실패 등이 아니라 exit ()를 호출함으로써)에서 항상 작동합니다.

저장된 상태 waitpid() 아동 프로세스가 종료 된 이유와 출구 코드를 인코딩합니다. 그 이유는 가장 중요하지 않은 바이트에 저장됩니다 ( status & 0xff), 종료 코드는 다음 바이트에 저장됩니다 (마스크 status & 0xff00 그리고 추출 WEXITSTATUS()). 프로세스가 정상적으로 종료되면 그 이유는 0이므로 WEXITSTATUS 8만큼 이동 (또는 256으로 나누기)과 동일합니다. 그러나 신호 (예 : Sigsegv)에 의해 프로세스가 죽으면 종료 코드가 없으며 사용해야합니다. WTERMSIG 이유 바이트에서 신호 번호를 추출합니다.

다른 팁

상태 변수가 'int'가 32 비트 수량 인 컴퓨터에서 서명 된 16 비트 정수 ( '짧은') 인 경우 종료 상태가 128..255 범위 인 경우 여전히 wexitstatus () 256으로 나누거나 단순히 오른쪽으로 이동하면 올바른 값을 제공하면 잘못된 값이 제공됩니다.

이는 단락이 32 비트로 연장되고 마스킹은 부호 확장을 취소하여 결과에서 올바른 (양수) 값을 남겨두기 때문입니다.

기계가 16 비트 정수를 사용한 경우 wexitstatus ()의 코드는 아마도 비슷한 동작을 보장하기 위해 마스크를 마스킹 할 것입니다.

#define WEXITSTATUS(status) (((status)>>8) & 0xFF)

구현이 wexitstatus () 매크로를 사용해야하는 세부 사항을 처리하기 때문입니다.

단일 유닉스 사양을 확인하여 알 수있는 한 당신의 시스템은 출구 상태를 두 번째로 오른쪽에서 가장 오른쪽으로 저장하는 것이지만 나는 믿지 않습니다. 표준 하다. 따라서 적어도 몇 가지 이유로 매크로를 사용해야합니다.

  • 맞습니다. 음수 비트를 비트 시프트하면 플랫폼에서 다른 일을합니다. 당신이 원하는 방식으로 작동합니까? 모르겠어요.
  • 그들은 간단합니다. 무엇을 분명히 분명합니다 WEXITSTATUS 하다. 다른 접근법에서는 덜합니다. 손으로 달린 버전을 본 경우 WIFSIGNALED, 당신은 그것을 인식 하시겠습니까? 보다 얼마나 걸립니까 WIFSIGNALED.
  • 휴대용이 가능합니다. 사양이 그렇게 말하는 방식이므로 모든 시스템에서 작동합니다 (적어도 거의 모든 UNIX와 같은 시스템).

여기서 0xff00은 이진 마스크입니다.링크 텍스트). 및 값으로 그것을 두 번째 바이트 (오른쪽에서 계산)를 제외하고 모든 비트를 0으로 설정합니다.

당신은 만 사용해야합니다 WEXITSTATUS 정상적으로 종료 된 것으로 알려진 과정에서. 이 정보는 WIFEXITED 매크로.

그리고이 주제의 실제 질문은 내 코드 에서이 매크로를 256으로 나누는 것으로 부르는 것과 동일합니까?

매크로는 코드를보다 읽기 쉽게 만들고 모든 POSIX 호환 구현에서 작동하도록 보장됩니다. 내가 아는 한 POSIX는 상태 형식을 지정하지 않으므로 코드가 어디에서나 작동 할 것으로 기대할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top