2016-06-24 8 views
0

테스트 시나리오는 IP로 올 ping이고 ctr + C는 스크립트에서 번갈아 호출됩니다.NETBSD 3.1 오류 - malloc() : 경고 : 재귀 호출

신호 처리기가 호출 될 때 ping이 malloc 내부에있는 것처럼 보입니다. malloc 및 malloc이라고도하는 신호 처리기는 아래 경고와 함께 반환됩니다. 의 malloc에 ​​() : 경고 : 재귀 호출

하지만 여전히 나는 그것이 충돌이 발생할 수있는 방법을 찾을 수 없습니다가, 누군가가

+0

'triptime'이 상수이고 다른 FP가 없다면 (컴파일시'triptime * 1000.0'이 수행됨), FP 루틴을 최적화하고 FP 지정자를 사용하여'printf()'를 최적화합니다 실패합니다. 그러나 여기에는 거의 컨텍스트가 없기 때문에 이것은 단지 추측 일뿐입니다. – chux

+0

"충돌"이라고 말하면 ping 바이너리, OS 또는 다른 것을 의미합니까? 분명히 3.1 ping (64 비트 타이밍 때문에 다른 최신 NetBSD에서)과 같은 줄로 보입니다. 또한 실행중인 명령 줄과 아키텍처는 무엇입니까? 특정 하드웨어와 관련된 이상한 하드웨어/OS 문제 일 수 있습니다. – abs

+0

질문이 업데이트되었습니다. 지금 확인하십시오. – Twinkle

답변

1

아, 비 재진입 함수 문제를 사용하여 지칠대로 지친 신호 처리기를 설명해주십시오 수 있습니다.

문제는 * BSD ping 님의 기능 추가 - 유지자가 처음부터 안전하게 작업을 수행하는 데 방해가된다는 것입니다.

FreeBSD는 1994 년에이 문제를 추가 1996 년에 그것을 발견하고 그것을 밝혀졌다보다

오픈 BSD가 추가 된 1998 년에 언젠가 최종 수정으로 문제를 해결하기 위해 훨씬 짧은 경로 있었어야 시작 이 문제는 1997 년에 발견되었지만 2002 년에 발견되었지만 완전히 문제의 성격을 놓치고 2015 년까지 완전히 수정하지 못했습니다.

NetBSD는 1996 년에이 문제를 추가했지만 발견 했으므로 아직 고쳐졌다. NetBSD는 아마도 OpenBSD ping을 가져와야합니다.

malloc()도 아니고 STDIO (printf() 포함)도 신호 처리기에 사용되는 모든 코드의 필요에 맞지 않습니다.

더 나은 장소 수십 등등 재진입의 안내, 신호 처리기 문제 등을 찾을 수있다, 그러나 아마이 질문과 대답을 허용 (와는 관련 질문 중 일부는) 좋은 시작이 될 것입니다 :

Why are malloc() and printf() said as non-reentrant?

+0

그레그 감사합니다. 당신 말이 맞아요. 이게 문제 야. 그러나 ctr + c를 누르면 ping 통계를 인쇄해야합니다. 여기서 printf를 피하는 방법에 대해 알고 계신가요? – Twinkle

+0

OpenBSD의'ping '포팅을 제안했지만, 그렇게 해보았으며, 생각보다 많은 작업이있었습니다 (할 가치가 있지만). 불행히도 코어 덤프를 피하기 위해 필요한 충분하고 적절한 수정은 아마 거의 길다. (FreeBSD의'ping '포팅은 훨씬 지루할 것입니다) –