2014-01-30 1 views
1

글쎄, 제목은 그것의 대부분을 말합니다.fflush는 신호 처리기에서 호출해도 안전합니까?

내 응용 프로그램이 stdout/file에 로깅 중이라고 가정 해 봅시다. 그러나 종료 될 때 항상 완전히 플러시되지는 않습니다. 한 가지 해결책은 각 로깅 조치 후 플러시하는 것이지만 프로그램을 허용 할 수 없을 정도로 느려지 게 만듭니다.

그럼, 질문은 fflush(file)입니다. 신호 처리기에서 호출해도 안전합니까? fflush(NULL)?

그렇지 않은 경우 이유를 알려주십시오. 이 문제에 대한 다른 솔루션 솔루션이 있습니까? 파일 처리 루틴에 있지 않다는 것을 안다면 아마 안전할까요?

+0

없음 [매뉴얼 페이지 (http://man7.org/linux/man-pages/man7/signal.7.html)에서 허가 기능 목록 신호 처리기 내부이 함수를 호출 알려주기 때문에 는 안전하다. 'fflush()'를 포함하지 않습니다. –

답변

2

신호 처리기 내에서만 비동기 안전 기능을 사용할 수 있으며 stdio 라이브러리는 포함하지 않습니다. POSIX 표준은 비동기식 인 함수 집합을 정의합니다. 플랫폼을 지정하지 않았으므로 일반적인 해결책을 모릅니다.

파일을 백업 파일 기술자 저장하는 경우 - fileno()를 사용하여 -는 POSIX/BSD 시스템을, 당신은 비동기 안전 기능을 사용하여 뭔가를 구제 할 수 있습니다 : write(), lseek() (플러시), fsync() 등이를 물론 stdio가 자체 버퍼를 사용하는 경우 도움이되지 않습니다.

(some Cert-C guidelines)

+0

방금 ​​발견 한 내용 : https://www.gnu.org/software/libc/manual/html_node/Nonreentrancy.html "그러나 핸들러에서 사용하는 스트림을 한 번에 프로그램에서 사용할 수 없다는 것을 알고 있다면 신호가 도착할 수 있다면 안전합니다. 프로그램이 다른 스트림을 사용한다면 아무런 문제가 없습니다. " 그래서 다른 어떤 함수도 특정 스트림에 쓰지 않는다고 보장 할 수 있다면'fflush (that_object)'를 호출하는 것이 이론적으로 안전해야합니다. – heinrich5991