문제

내 프로그램을 가지고있는 의도적으로 수행으로 나누기로(그리고 저장과 휘발성 변수)를 중단하기 위해 특정 상황에서.그러나고 싶할 수 있는 사용이 중단,변경하지 않고 이 매크로가 수행하는 부여한다.

하는 방법은 없 ignore it?

해봤을 사용하여

#include <signal.h>
...
int main(void) {
  signal(SIGFPE, SIG_IGN);
  ...
}

하지만 그것은 여전히 죽는 메시지와 함께"부동 소수점 예외(중핵을 덤프)".

나는 실제로 사용하지 않는 값 그래서 저는 정말로 걱정하지 않은 무엇에 할당된 변수0,무작위,정의되지 않은...

편집:내가 이것을 알고 있지 않은 가장 뛰어난 휴대성을 자랑하는,그러나 그것의 용도에 대한 임베디드 장치에서 실행되는 많은 서로 다른 Os.기본 중지 조치를 나누기로;다른 플랫폼을 필요로하는 감 유도 재부팅(와 같은 무한 루프 인터럽트를 비활성화됩니다).PC(linux)테스트는 환경,내가 원하는 사용 중단에서 부문 제로 의존하지 않고 같은 것들에 assert.

도움이 되었습니까?

해결책

왜 의도적으로 제로로 나누기를 중단 하시겠습니까? 당신은 할 수 없었습니다 exit(-1) 아니면 동등한가요?

특히 분열의 결과가 0으로 필요하지 않으면 이것은 말이되지 않습니다.

다른 팁

좋아, 먼저, 당신은 사용해야합니다 SIGACTION (2) 감가 상각 대신 signal().

둘째, 프로그램을 종료 할 목적으로 SIGFPE를 사용하는 것은 특허 적으로 터무니 없다. 왜냐하면 SIGTERT 또는 SIGUSR1과 같은 신호를 부작용에 대해 다른 신호를 깎고 의미 론적 가치를 무시하는 대신 SIGUSR1과 같은 신호를 올려야하므로 특허 적으로 터무니 없다. 더 구체적으로, 남자 페이지 SIGACTION (2) SIGFPE에 대한 blurb가있는 메모 섹션이 있습니다.

당신이해야 할 일은입니다 인상 (3) 종료하려는 경우 신호. 그런 다음 사용하십시오 sa_handler 필드 sigaction 무시할지 여부를 변경하기위한 구조 (SIG_IGN) 또는 종료 (SIG_DFL) 그 신호에.

int main(void) {
  struct sigaction my_action;

  my_action.sa_handler = SIG_IGN;
  my_action.sa_flags = SA_RESTART;
  sigaction(SIGUSR1, &my_action, NULL);

  raise(SIGUSR1);  /* Ignored */

  my_action.sa_handler = SIG_DFL;
  sigaction(SIGUSR1, &my_action, NULL);

  raise(SIGUSR1); /* Terminates */

  return 0;
}

즉, 나는 당신이 간단한 대신 신호를 사용하는 이유를 알 수 없습니다. exit().

반환 값을 확인하십시오

signal(SIGFPE, SIG_IGN);

당신이 얻는다면 SIG_ERR, 값을 확인하십시오 errno 무엇이 잘못되었는지 알아 내기 위해. 그것은 당신이 포용 적으로 할 수있는만큼입니다.

나는 당신이 분열을 0으로 바꾸고 싶지 않다는 것을 알고 있지만, 포트할 수없고 반 직관적입니다. 일부 조건이 발생하면 코드 럼프를 원하지만 편집 코드 없이이 동작을 비활성화 할 수 있습니까? 사용 assert 그리고 NDEBUG.

이것은 휴대용이 아니지만 x86에서는 FPU를 제어함으로써 할 수 있습니다.

Linux에서 GCC 사용 (다른 컴파일러에는 비슷한 시설이 있다고 확신합니다).

#include <fpu_control.h>

_FPU_SETCW (_FPU_DEFAULT);

_FPU_DEFAULT 기본값 _FPU_MASK_ZM SET으로 기본적으로 기본적으로 (ZM은 제로 다이드 마스크를 나타냅니다).

void handler(int trapId)
{
   // Whatever
}

signal(SIGFPE, handler);

프로그램이 덜 고안된 표현을 통해 종료 할 수 있습니까? 예를 들어:

#include <signal.h>

#ifdef DEBUG
#define DIE_HERE raise(SIGFPE)
#else
#define DIE_HERE
#endif

나는 당신의 프로그램의 다른 부분을 의도하지 않게 제로로 나누지 않도록 기본 동작을 무시하는 것을 주저 할 것입니다. 또는 코어 덤프를 얻기 위해이 방법을 종료하도록 강요하는 경우 디버거 내에서 중단 점을 사용하여 검토 할 수 있습니다. 또는 GDB 디버거가있는 시스템을 사용하는 경우 Gcore 유틸리티가 유용 할 수 있습니다.

이 있는 경우 통제를 통해 충돌 코드,그때 나는 또한을 변경하는 코드를 죽습니다 몇 가지 다른 방법이있다.지 않는 경우에,당신이 시도할 수 있습을 설치하는 빈 신호 처리기 대신(예:사 signal(SIGFPE, &EmptyFunction)),하지만 당신은 여전히 의존에서 정의되지 않은 행동이 없다,그래서 그것을 보장하는 것입니다 여전히 작업을 다른 시스템에서,또는 다른 커널 또는 C 라이브러리 버전입니다.

충돌 코드를 통해 lnmiit l이면 다른 방식으로 죽기 위해 코드를 변경하는 것이 좋습니다. 그렇지 않으면 설치할 수 있습니다.

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