tri*_*ity 3 c asynchronous gnu timer alarm
任何人都可以在gnu C中说明settimer或alarm功能的使用,请参考一些程序示例吗?
我有一个连续处理一些数据的程序,我需要设置一个每t秒关闭一次的计时器/警报,响应于此,我需要将处理后的数据存储到文件中.这个文件写入必须是异步的<即数据处理和文件写入不能相互等待>.我浏览了GNU C Library页面,但我理解不了多少..
[编辑]
我得到了这个程序:
#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
#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;
}
Run Code Online (Sandbox Code Playgroud)
但似乎我在计时器打开时无法做任何事情.我应该根据自己的需要修改什么?Pl建议.. [/编辑]
下面是一个例子这里它采用setitimer()定期调用DoStuff().
这里的关键是调用setitimer()OS调度中的结果将在SIGALRM指定的时间过后发送到您的进程,并且由程序来处理该信号.您可以通过为信号类型(DoStufF()在本例中)注册信号处理函数来处理信号,之后操作系统将知道在计时器到期时调用该函数.
您可以阅读setitimer() 手册页以了解参数是什么以及如何取消计时器.
注意:如果您希望计时器仅触发一次,则必须调用alarm()或ualarm()代替setitimer().
/*
* setitimer.c - simple use of the interval timer
*/
#include <sys/time.h> /* for setitimer */
#include <unistd.h> /* for pause */
#include <signal.h> /* 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");
}
Run Code Online (Sandbox Code Playgroud)