2011-03-25 7 views
4

C/C++ Linux에서 'n'밀리 초마다 활성화되는 함수 (예 : 신호 처리기)가 필요합니다. 밀리 초 해상도로 타이머 이벤트에 등록하려면 신호 등을 어떻게 설정해야합니까?사용자 공간의 C/C++ 타이머 신호 처리기

정확도는 매우 중요하지 않지만 100 밀리 초 정도가 필요합니다.

저는 리눅스에 익숙하지 않아 어디서부터 시작해야할지 모르겠습니다.

답변

3

setitimer(2)은 좋은 시작이지만 정말로 신호와 비동기로 가고 싶습니까? 그렇지 않은 경우 select(2) 또는 poll(2)의 주 루프를 가질 수 있으며 적절한 시간이 초과 될 수 있습니다.

+0

비동기가 필요합니다. – user623879

+0

잘 작동합니다. setitimer, thx – user623879

+2

신호 처리기 내부에서 수행 할 작업을주의하십시오. I 신호는 인터럽트 인 것처럼 전달되며 언제든지 발생할 수 있습니다. 재입국에 대해서는 매우 신중해야합니다. http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_21.html –

6

setitimer (POSIX 2008 표기 : OBS)보다 훨씬 안전한 대체 방법은 POSIX 타이머를 사용하고 타이머 만료 기능을 신호 처리기가 아닌 스레드에서 실행하는 것입니다. 이렇게하면 비동기 신호 안전 기능 만 사용하는 것으로 제한되지 않습니다. 그들은 여기에서 설명하고 있습니다 : 당신이 POSIX 타이머 API를 좋아하지 않는 경우에

http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_08_05

, 당신은 대신 단지 루프에서 잠들지 스레드를 생성하고, 해당 스레드를 제외한 모든 스레드 타이머 신호를 차단할 수 . 그러면 별도의 스레드에서 실행되고 비동기 신호가 안전하지 않은 함수를 방해 할 위험이 없기 때문에 신호 처리기에서 원하는 기능을 자유롭게 사용할 수 있습니다.