2014-08-29 8 views
0

연습 :신호는

나의 이해에서

, 하나는 코드의 임계 영역은 중단없이 실행을 허용 할 수 있습니다.

표준 신호와 같은 방해 신호를 차단하여 신호를 차단할 수 있습니다.

충돌 :

은 내가 어떻게가 중요 섹션 코드에서 발생하는 오류/표준 신호를 처리 할 수있을 것입니다. 내가 생각할 수있는 고전적인 예는 메모리를 할당하지 못한 것입니다. 또는 잘못된 주소로 인해 메모리를 확보하지 못했습니다. 내 이해에서 "alloc/free"섹션의 메모리 조작은 중요 섹션 부분에 속합니다. 내가 노력이 무엇

:

내가 신호 재진입의 제목을 주변 검색뿐만 아니라 공부하려고 않았다 그러나 나는이 충돌 우연히.

일부 입력 사항은 좋을 것입니다. 미리 감사드립니다.

+0

메모리를 할당 할 때 * 신호 *와 관련이 없습니다. 신호는 Ctrl-C 또는 죽어가는 자식이 원인이됩니다. –

+0

임계 구역 외부에 메모리를 할당하십시오. 중요한 섹션 내부의 포인터 만 업데이트하십시오. –

+0

또는 메모리 오류? 예를 들면. – Illasera

답변

2

POSIX 신호, 리턴 코드 및 예외는 다른 것입니다. 코드의

중요한 부분은 정확하게는 중단

없이 실행, 중요한 부분은 뮤텍스 잠금 장치에 의해 보호 코드 블록이다. 즉, 한 번에 하나의 스레드 만 임계 영역에 들어갈 수 있습니다.

중요한 섹션 코드에서 발생하는 결함/표준 신호를 어떻게 처리 할 수 ​​있습니까? 내가 생각할 수있는 고전적인 예는 메모리 할당 실패입니다.

실패시 mallocNULL을 반환하지만 여기에는 신호가 관련되지 않습니다.

또는 더 나은 주소는 잘못된 주소로 인해 메모리를 확보하지 못했습니다.

이 오류 유형은 코드에서 처리 할 수 ​​없습니다. 가능한 한 일찍 발견되어 수정되어야하는 프로그래밍 오류입니다. 이 유형의 오류를 발견하는 데 가장 좋은 도구 중 하나는 Valgrind입니다. 당신이 SIGSEGV, SIGBUS, SIGILL 또는 SIGFPE 신호를 수신 할 때, 프로세스 주소 공간의 상태가 불확실하기 때문에

코드는 SIGSEGV가 생성 된 시간에 의해 모든 프로세스 메모리를 손상 수도 있으므로 복구 할 수있는 좋은 방법이 없습니다 이 신호가 수신 된 후 올바른 프로그램 상태.

+0

표준 신호를 처리 할 때 실제로 목표로했던 목표는 메모리 덤프 코어를 실제로 스트림으로 던져 버리는 것이 었습니다. 복구하지 않기 위해서였습니다. 분명히 소프트웨어가 충돌로 향하고 있다면, 충돌이 발생하도록해야합니다. – Illasera

+1

@Illasera이 신호는 기본적으로 코어 덤프를 발생시킵니다. ['man signal (7)'] (http://man7.org/linux/man-pages/man7/signal.7.html)을 참조하십시오. 'ulimit -c unlimited'로'.bash_profile'에서 코어 덤프를 활성화해야 할 수도 있습니다. 자세한 내용은 ['man core (5)'] (http://man7.org/linux/man-pages/man5/core.5.html)을 참조하십시오. 또는'setrlimit (RLIMIT_CORE, ...)'와'prctl (PR_SET_DUMPABLE, 1, 0, 0, 0)'을 사용하여 프로그래밍 방식으로 코어 파일을 활성화하십시오. –

+0

한 번만 확인하고 올바르게 확인한 후 충돌 체크 시점에서 스택 백 트레이싱과 파일 설명자를 포함하지 않으며 procfs 또는 다른 쿼리에서 채워진 다른 데이터도 덮어 쓰지 않습니다. 내 자신의 일치를 수행 할 수 있습니다 이제 질문은, 귀하의 주요 대답을 기반으로, 충돌하는 동안 같은 데이터를 얻는 경우에도 유효합니다. (필자는 그 사실을 지적하지 않았다.) – Illasera