2011-03-25 37 views
4

我需要一個函數(例如信號處理程序)在C/C++ linux中每n毫秒激活一次。如何設置信號等......以毫秒分辨率註冊計時器事件。用戶空間中的Linux C/C++定時器信號處理程序

準確度不是超級重要的,但需要在100毫秒左右。

我是新來的linux,我真的不知道從哪裏開始。

回答

3

setitimer(2)是一個很好的開始,但是你真的想與信號異步嗎?否則,您可以使用select(2)poll(2)的主循環以及適當的超時。

+0

需要異步 – user623879 2011-03-25 19:41:19

+0

工程與setitimer很好,thx – user623879 2011-03-25 20:18:53

+2

小心你在信號處理程序中做什麼。我的信號被傳遞,就像它是一箇中斷一樣,並且可能在任何時候發生。你必須非常小心重新進入。請參見http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_21.html – 2011-03-25 20:33:45

6

setitimer(POSIX 2008標記爲OBS olete)相比,更安全的替代方案是使用POSIX計時器,並使計時器到期函數在線程中運行,而不是在信號處理程序中運行。這樣您不僅僅限於使用異步信號安全功能。他們要在這裏記載:

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

如果你不喜歡的POSIX API計時器,您可以改爲創建一個線程,僅僅睡在一個循環,並阻止在所有的線程定時信號,除了螺紋。然後,您可以自由地在信號處理程序中使用您喜歡的任何函數,因爲它將在單獨的線程中運行,並且不存在中斷異步信號不安全函數的危險。