需要程序来说明在GNU C中使用settimer和alarm函数

任何人都可以在gnu C中说明settimer或alarmfunction的使用,请参考一些程序示例吗?

我有一个连续处理一些数据的程序,我需要设置一个每t秒关闭一次的计时器/警报,响应于此,我需要将处理过的数据存储到一个文件中。 这个文件写入必须是异步的。 我浏览了GNU C Library页面,但我理解不了多少..

[编辑]

我得到了这个程序:

#include  #include  #include  #define INTERVAL 1 int howmany = 0; void alarm_wakeup (int i) { struct itimerval tout_val; signal(SIGALRM,alarm_wakeup); howmany += INTERVAL; printf("\n%d sec up partner, Wakeup!!!\n",howmany); tout_val.it_interval.tv_sec = 0; tout_val.it_interval.tv_usec = 0; tout_val.it_value.tv_sec = INTERVAL; /* 10 seconds timer */ tout_val.it_value.tv_usec = 0; setitimer(ITIMER_REAL, &tout_val,0); } void exit_func (int i) { signal(SIGINT,exit_func); printf("\nBye Bye!!!\n"); exit(0); } int main () { struct itimerval tout_val; tout_val.it_interval.tv_sec = 0; tout_val.it_interval.tv_usec = 0; tout_val.it_value.tv_sec = INTERVAL; /* 10 seconds timer */ tout_val.it_value.tv_usec = 0; setitimer(ITIMER_REAL, &tout_val,0); signal(SIGALRM,alarm_wakeup); /* set the Alarm signal capture */ signal(SIGINT,exit_func); while (1) { //printf("!"); } return 0; } 

但似乎我在计时器打开时无法做任何事情。我应该根据自己的需要修改什么? Pl建议.. [/编辑]

这里有一个例子,它使用setitimer()定期调用DoStuff()

这里的关键是调用setitimer()导致操作系统调度SIGALRM在指定的时间过后发送到您的进程,并且由程序来处理该信号。 您可以通过为信号类型(在这种情况下为DoStufF()注册信号处理函数来处理信号,之后操作系统将知道在定时器到期时调用该函数。

您可以阅读setitimer() 手册页以确定参数是什么以及如何取消计时器。

注意:如果您希望计时器只触发一次,则必须调用alarm()ualarm()而不是setitimer()

 /* * setitimer.c - simple use of the interval timer */ #include  /* for setitimer */ #include  /* for pause */ #include  /* for signal */ #define INTERVAL 500 /* number of milliseconds to go off */ /* function prototype */ void DoStuff(void); int main(int argc, char *argv[]) { struct itimerval it_val; /* for setting itimer */ /* Upon SIGALRM, call DoStuff(). * Set interval timer. We want frequency in ms, * but the setitimer call needs seconds and useconds. */ if (signal(SIGALRM, (void (*)(int)) DoStuff) == SIG_ERR) { perror("Unable to catch SIGALRM"); exit(1); } it_val.it_value.tv_sec = INTERVAL/1000; it_val.it_value.tv_usec = (INTERVAL*1000) % 1000000; it_val.it_interval = it_val.it_value; if (setitimer(ITIMER_REAL, &it_val, NULL) == -1) { perror("error calling setitimer()"); exit(1); } while (1) pause(); } /* * DoStuff */ void DoStuff(void) { printf("Timer went off.\n"); }