2013-03-16 2 views
3

누군가가 운영 체제 프로그래머이거나 시스템 레벨 라이브러리 코드를 작성하는 경우 세그먼트 화 오류 처리기를 작성하는 것이 좋습니다. 예를 들어, OS 프로그래머가 코드를 작성하여 해당 응용 프로그램 프로세스에 SIGSEGV 신호를 보내는 것처럼 말입니다. 또는 시스템 라이브러리 프로그래머가 SIGSEGV 신호를 처리 할 수 ​​있으며 세그먼테이션 결함을 생성하기 위해 라이브러리 코드로 인한 작업을 실행 취소 할 수 있습니다. 하지만 왜 C의 응용 프로그램 프로그래머가 세분화 오류 처리기를 작성해야합니까? 그가 핸들러를 작성하면, 그는 이미 메모리의 일부분을 손상시켰다. 애플리케이션 프로그래머가 세분화 오류를 처리하고 프로그램 실행을 계속할 수 있도록 인스턴스를 제공 할 수 있습니까?세분화 오류 처리기는 C의 응용 프로그램 프로그래머가 작성해야합니까?

+0

왜 SEGFAULT를 계속 사용 하시겠습니까? 그리고 핸들러는 경계 조건을 검사하기 위해 SEGFAULTS를 피하기 위해 작성되었으며, SEGFAULT를 발생시키는 코드에 약간의 기회가있을 경우 malloc 후에 NULL을 반환하는 것과 같이 체크하고 종료하거나 중단해야하지만 계속해서는 안됩니다. SEGFAULTS를 피하십시오 . – Abhineet

답변

3

처리 SIGSEGV 등은 상태를 저장하고 시정 조치를 취할 수 있습니다. Mr 32 (및 기타)은 정확하며 기본 회선 코드 만 다시 시작할 수는 없습니다. 대신 할 수 있습니다 longjmp() siglongjmp(); 이 경우 메인 라인의을 다시 시작할 수 있습니다. 또한 async safe 함수 만 호출하면 매우주의해야합니다. 이것은 매우 까다 롭습니다. 그러나 일부 응용 프로그램은 다음과 같습니다 :

  1. 건강/안전 - 치명적인 상황이 발생하지 않도록하십시오.
  2. 금전적 손실을 초래할 수있는 거래 데이터 손실.
  3. 제어 시스템 - 화학자를위한 예제 적정 소프트웨어.
  4. 진단 - 추후 소프트웨어 개선을 위해 충돌 조건이 기록 될 수 있습니다. Jay

exit()를 호출으로 아마 좋은하지 않고 _exit() 더 좋을 것입니다. 차이는 atexit()입니다.

은 참조 : Cert async safe는, Glibc async-safe listSimilar question, longjmp() and signals not portable,
다음은 OS에서 OS에 따라 다릅니다. 조언은 시스템에 따라 다릅니다!


추가 문제

  • SIGSEGV를 잡을 수있는 프로그램에서 사용하는 일부 라이브러리. 확실히 Empress Database의 버전은 그것을 연결합니다. 당신은 당신의 도서관이 무엇을 사용하고 있고 그들과 체인을하고 있는지 알아야합니다.
  • 스택 및 힙 (malloc 등)은 jump_buf을 포함하여 손상 될 수 있으므로 오류 처리는 특히 편집증 일 수 있습니다.
  • 중요한 작업을 다른 작업으로 연기하는 등 훨씬 더 간단한 다른 많은 솔루션이 있습니다.
  • longjmp()은 신호가 이고 정의되지 않음은 C99 표준에 따라 정의되었지만 대부분의 시스템에서 잘 작동합니다. 좀 더 현학적 인 사람이라면 siglongjmp()을 사용할 수 있습니다. 진단 로깅은 괜찮지 만 나열된 다른 용도 (안전 등)에는 사용하지 않을 것입니다. 워치 독 작업을 알리는 것이 더 적절할 수 있습니다.
4

AFAIK, 세분화 처리기는 응용 프로그램 수준에서 디버깅 정보 (예 : 메모리 덤프, 레지스터 값 및 기타 응용 프로그램 관련 정보)를 출력 한 다음 응용 프로그램을 종료 할 수 있습니다.

세그먼트 화 오류로 인해 메모리가 손상되었을 수 있기 때문에 정확한 정보를 모두 얻거나 얻지 못할 수도 있습니다.

세그멘테이션 오류 후 프로그램 실행을 계속할 수있는 상황을 인식하지 못했습니다. 그래서 다른 사람의 존경하는 사용자 가이에 약간의 빛을 던질 수있을 것입니다.

1
library programmer might handle that signal SIGSEGV and may 
undo the operations caused by the library code for creating segmentation 

세그먼트 오류가 발생하면 스레드 또는 프로세스가 중단됩니다.

세그먼트 화 오류가 발생한 코드는 실행 취소 할 수 없습니다. 오히려 그럴 수 있습니다 해당 구성 요소를 다시 시작.

0

세그먼트 화 오류는 프로그램이 예상치 않은 메모리 부분에 쓰기 때문에 발생합니다. 응용 프로그램 개발자는이를 처리 할 코드를 작성하지 않고 코드를 작성하여 코드를 피합니다. 그래서 메모리에 쓸 때 체크를해야합니다.

2

SIGKILL, SIGCONT 및 SIGSTOP을 제외한 모든 신호를 잡을 수 있습니다. 따라서 SIGSEGV를 잡을 수는 있지만 종료하지 않기로 결정하면 그 동작은 예측할 수 없습니다.