下面這個例子顯示了設置鬧鐘的方法。
源代碼是:
gcc -Wall setitimer.c 運行程序: ./a.out man setitimer 得到如下內容:
而鬧鐘信號分爲三種,ITIMER_REAL、ITIMER_VIRTUAL、ITIMER_PROF分別代表了當系統運行時產生鬧鐘、當進程在運行時產生鬧鐘、兩種情況下都會產生。通常情況下,只要我們啓動了程序鬧鐘,ITIMER_REAL計時就一定會持續進行;如果是ITIMER_VIRTUAL則只有在程序在運行時計時,如果你程序裏有sleep之類的調用,則在sleep的時候是不會產生SIGVTALRM鬧鐘的。 比如下面這個代碼將只會產生SIGALRM鬧鐘:
|
定時器設置
函數alarm設置的定時器只能精確到秒,而以下函數理論上可以精確到微妙:
#include <sys/select.h>
#include <sys/time.h>
int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);
函數setitimer可以提供三種定時器,它們相互獨立,任意一個定時完成都將發送定時信號到進程,並且自動重新計時。參數which確定了定時器的類型,如表10-6所示:
表10-6 參數which與定時器類型
這三種定時器定時完成時給進程發送的信號各不相同,其中ITIMER_REAL類定時器發送SIGALRM信號,ITIMER_VIRT類定時器發送SIGVTALRM信號,ITIMER_REAL類定時器發送SIGPROF信號。
函數alarm本質上設置的是低精確、非重載的ITIMER_REAL類定時器,它只能精確到秒,並且每次設置只能產生一次定時。函數setitimer設置的定時器則不同,它們不但可以計時到微妙(理論上),還能自動循環定時。在一個Unix進程中,不能同時使用alarm和ITIMER_REAL類定時器。
結構itimerval描述了定時器的組成:
struct itimerval
{
struct tim. it_interval; /* 下次定時取值 */
struct tim. it_value; /* 本次定時設置值 */
}
結構tim.描述了一個精確到微妙的時間:
struct tim.
{
long tv_sec; /* 秒(1000000微秒) */
long tv_usec; /* 微妙 */
}
函數setitimer設置一個定時器,參數value指向一個itimerval結構,該結構決定了設置的定時器信息,結構成員it_value指定首次定時的時間,結構成員it_interval指定下次定時的時間。定時器工作時,先將it_value的時間值減到0,發送一個信號,再將it_value賦值爲it_interval的值,重新開始定時,如此反覆。如果it_value值被設置爲0,則定時器停止定時;如果it_value值不爲0但it_interval值爲0,則定時器在一次定時後終止。
函數setitimer調用成功時返回0,否則返回-1,參數ovalue如果不爲空,返回上次的定時器狀態。
函數getitimer獲取當前的定時器狀態,整型參數which指定了讀取的定時器類型,參數value返回定時器狀態。函數調用成功返回0,否則返回-1。
Linux 定時器設置(二)
2010-04-12 17:13
|