2010-12-29 3 views

답변

6

아니요. 비동기 신호 안전 기능 목록은 맨 페이지 signal(7)을 확인하십시오. fprintf은 해당 목록에 포함되어 있지 않습니다.

서식이 필요하지 않은 경우 write(STDERR_FILENO, <buf>, <buflen>)을 사용하여 stderr에 쓸 수 있습니다.

+0

libc의 함수 목록 또는 커널 syscalls 목록입니까? – osgx

+0

http://linux.die.net/man/7/signal 목록이 없습니다. 나에게 링크를 줄 수 있니? – osgx

+1

@osgx : 링크가 답변에 추가되었습니다. 이것은 libc 표준을 포함하는 posix 함수 목록입니다. 그러나 libc 표준은 signal()을 제외한 libc 함수가 재진입 적이라는 것을 요구하지 않으므로 신호 처리기 내에서 libc 함수를 사용할 수 없습니다. – Fabian

4

이 안전하지 않다, 인용 IBM developerWorks 기사 약 Signal Handling Safety

신호 처리기 fprintf와 함께 메시지를 출력하고, 프로그램은 동일한 스트림을 사용 fprintf와 호출의 중간에 있던 가정 신호가 전달되었을 때 . 신호 처리기의 메시지와 프로그램의 데이터는 모두 손상 될 수 있습니다. 두 호출이 동일한 데이터 구조 즉 스트림 자체에서 작동하기 때문입니다.

+0

glibc에는 FILE * 내부에 IO 잠금이 있습니다. 따라서 fprintf를 인터럽트하는 fprintf가 대기합니다. – osgx

+4

@osgx : 신호 처리기는 스레드가 아닙니다. 시그널 핸들러 내부에서 기다리는 것은 매우 나쁜 소식이다. 왜냐하면 시그널 핸들러가 완료 될 때까지 락을 가지고있는 쓰레드가 진행을 할 수 없기 때문이다. 그래서 교착 상태에 빠졌습니다. –

+0

@Ben Voigt, 정말 "스레드"라고합니까? – osgx

관련 문제